cocos2d-x场景切换时内存过高导致crash解决方法

在用cocos2d-x时很多人都会遇到一个问题,就是在pc上运行都是ok的,可是在ipad和andriod上面,在场景切换时时常会挂掉,用苹果自带的Instruments工具检测时,发现在场景正常运行时,内存大概保持在三四十兆,但是在场景切换时,一瞬间会达到七八十兆,遇到一些素材比较多或者层比较多的场景,则会达到一百多兆。大家知道在ipad1上面,内存最大是128M,那么这个程序如果在ipad1上面运行,肯定会经常挂掉。遇到问题,只能一步步分析,一步步找。

(1)先把所有场景的retain的东西检查一遍,看看在Onexit的时候有没有release掉,这个检查完以后,还是会crash,所以这种情况不是根源。

(2)对于有好几个层的场景,在init的时候,先加载第一个层的,而不是把所有层的东西全部加载完,在切换层的时候再加载相对应的层,这种方法果然有效,当切换到这个场景的时候,内存果然减少了一半左右。但是对于只有一个层的场景来说,在切换时也是会挂,所以问题还没有找完全。

(3)我们知道,在每个场景里面会有一个init函数,一个onEnterTransitionDidFinish函数,一个Onexit函数,init实现一些初始化工作,onEnterTransitionDidFinish在init之后执行,Onexit在场景退出时回收init时分配的资源。在调试时发现一个很有趣的现象,那就是从场景一切换到场景二时,在切换的一瞬间会内存会非常高,但是过了一段时间后,内存会回到一个平稳的状态,譬如切换时内存会达到80M,切换过后内存会降到50M。分析原因,怀疑是上一个场景的内存还没有释放,然后这一个场景的内存已经分配,所以两个叠加在一起,就比较高了。所以我便在第一个场景的Onexit函数中加一个断点,在第二个场景的init和onEnterTransitionDidFinish函数中各加一个断点,然后运行程序,发现程序先到第二个场景的init中,然后再回到第一个场景的Onexit中,最后才到第二个场景的onEnterTransitionDidFinish中。我才恍然大悟,原来在场景切换时,不是马上会执行第一个场景的Onexit函数,而是先到第二个场景的init中加载资源,然后回到第一个场景中释放资源,最后才是到onEnterTransitionDidFinish中。

最终解决方法:

把一些资源的初始化放到onEnterTransitionDidFinish中进行,那么究竟应该把那些资源放到onEnterTransitionDidFinish中初始化,而那些资源又只能放到init中呢?

(1)像背景图这种只能放到init中,像场景切换时要看到的一些精灵,必须放到init中,不然场景切换时会看不到背景或者一些精灵。

(2)象精灵的一些动画,动作,可以放到onEnterTransitionDidFinish中来初始化。

举个例子:

譬如一只船在划动,那么船这只精灵在场景切换时要展示,所以必须放在init中

//小船精灵的加载

m_boatAction = CCSprite::spriteWithFile(s1_little_boat1);

addChild(m_boatAction);

m_boatAction->setPosition( CCPointMake(s.width/2, s.height/2+130));

m_boatAction->setScale(0.3);

m_boatAction->retain();

而船划动的动作,就可以放到onEnterTransitionDidFinish来初始化和执行

CCSize s = CCDirector::sharedDirector()->getWinSize();

CCAnimation* animation = CCAnimation::animation();

char frameName[100] = {0};

for( int i=1;i<=5;i++)

{

sprintf(frameName, "scene1/little_boat%d.png", i);

animation->addFrameWithFileName(frameName);

}

CCActionInterval*  action = CCAnimate::actionWithDuration(2, animation, false);

repeatAction = CCRepeatForever::actionWithAction(action);

repeatAction->retain();

通过这三步,基本上就可以避免在场景切换时内存过而导致crash的情况

so-fareast-theme-font: minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin'>。然后又降到16MB。这时候,你再依次加载剩下的4个4MB的,这时,最多会彪到(4*3 + 4*2 + 16=36)MB。

在这两种情况下,内存的峰值使用相差12MB。

转载于:https://www.cnblogs.com/Clin/archive/2013/05/06/3063095.html

[转]cocos2d-x场景切换时内存过高导致crash解决方法相关推荐

  1. Java进程占用内存过高,排查解决方法

    Java进程占用内存过高,排查解决方法 参考文章: (1)Java进程占用内存过高,排查解决方法 (2)https://www.cnblogs.com/eeexu123/p/10913389.html ...

  2. 场景切换时清理缓存!!CCTextureCache、CCSpriteFrameCache、CCAnimationCache

    cocos2d-x中存在3个缓存类,都是全局单例模式. 1.CCTextureCache 首先是最底层也最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源 ...

  3. U3D 场景切换时 脚本对象,GO对象,资源对象的问题

    U3D 场景切换时 脚本对象,GO对象,资源对象的问题 脚本对象:在LUA中写了一个actor类,它封装了角色逻辑,引用了一个GO. GO对象:通过 GameObject.Instantiate(资源 ...

  4. ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法

    ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 参考文章: (1)ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 (2)ht ...

  5. Ubuntu修改grub进入Memtest86内存测试模式的退出解决方法

    Ubuntu修改grub进入Memtest86内存测试模式的退出解决方法 这是误改/etc/default/grub 文件中GRUB_DEFAULT=3导致的 解决方法 第一步 修改虚拟机设定,改为从 ...

  6. explorer.exe应用程序错误说明 0X000000该内存不能为read的解决方法

    0X000000该内存不能为read的解决方法 出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了. 一:先说说硬件: 一般来说,电脑硬件是很不容易坏的.内存出现问题的可 ...

  7. (转)explorer.exe应用程序错误:0x000000该内存不能为read的解决方法

    0X000000该内存不能为read的解决方法 出现这个现象有多方面的原因,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了. 一.先说说硬件: 一般来说,电脑硬件是很不容易坏的.内存出现问 ...

  8. 内存不能为读写的解决方法

    内存不能为读写的解决方法 出现这个现象的原因,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了. 一.先说说硬件: 一般来说,电脑硬件是很不容易坏的.内存出现问题的可能性并不大(除非你的内存 ...

  9. 搜狗输入法在idea打不了汉字_IDEA下搜狗输入法输入中文时卡着不动的参考解决方法...

    在IntelliJ IDEA工具的java编辑窗口,给代码增加注释时发现,输入中文时,搜狗输入法界面不动,一直卡着,如图: 我想输入"根据"两个字,但搜狗输入法界面一直卡着不刷新, ...

  10. malloc函数分配内存失败的原因及解决方法

    原文链接:http://blog.csdn.net/lighthear/article/details/70146602 malloc函数分配内存失败的原因及解决方法 先说结论 malloc()函数分 ...

最新文章

  1. 前后端分离的探索(二)
  2. cmd批处理命令大全1
  3. js常用事件整理—兼容所有浏览器
  4. 跨链(8)Cosmos之“跨链交互协议IBC”前言
  5. Hadoop 06_MapReduce2.0(YARN)
  6. php mysql 绑定变量,在MYSQL中,怎么用PDO绑定变量的方式插入数据?
  7. php分享二十四:数组
  8. python 多and or执行顺序
  9. 因讨要介绍费引发纠纷 浙江龙湾一男子砍死房产中介
  10. php获取csv文件乱码,php使用fgetcsv读取csv文件乱码解决方法
  11. linux 磁带机备份是否完成,Linux环境下磁带机的直接备份操作
  12. 我的世界java平台缺少证书_解决https安全证书缺少的问题
  13. HTML5:Animate cc交互之“影片剪辑”实现“按钮”功能
  14. MyBatis详解(一):入门程序
  15. There appears to be trouble with your network connection
  16. jQuery 的 slideUp 动画,当鼠标快速连续触发, 动画会滞后反复执行,该如何处理呢
  17. 4.2-知识图谱在电商领域中的应用实践
  18. win10桌面右下角网络图标中找不到网络
  19. Java 12位uuid_java如何生成12位永远不重复的数字
  20. 想做游戏测试工程师?这几点不知道可不行!

热门文章

  1. 管理感悟:减少代码量的好办法
  2. is not in the sudoers files的解决办法
  3. yii验证在一个数组内_PHP实现一个轻量级容器
  4. .net 编译工具_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实
  5. 手把手分析 mfc 程序创建 代码执行流程
  6. vs code为什么不出现小黑框_为什么越来越多商家开通微信小程序商城?
  7. linux ftp win nt,Java中apache包中FTPClient读取win NT上的FTP服务器文件失败
  8. 永磁无刷电机及其驱动技术_「技术」某种车型后驱动桥装配工艺及其工装的设计...
  9. 浏览器request得不到cookie_Servlet第五篇「介绍会话技术、Cookie的API、详解、应用」...
  10. 系统评测指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F-Score