cocos2dx 中切换场景内存占用过高的处理
1、运行场景:
CCScene *pScene = HelloWorld::scene();
pDirector->runWithScene(pScene);
2、替换场景:
(1)
CCScene *pScene=SceneTestScene::scene();
CCDirector::sharedDirector()->replaceScene(pScene);
CCScene *pScene=SceneTestScene::scene();
CCDirector::sharedDirector()->pushScene(pScene);
CCDirector::sharedDirector()->pushScene(pScene);
(3)
CCScene *pScene=SceneTestScene::scene();
CCDirector::sharedDirector()->popScene(pScene);
CCDirector::sharedDirector()->popScene(pScene);
3具体的代码执行流程
B ---- init();
A ---- onExit();
B ---- onEnter();
B ---- onEnterTransitionDidFinish();
B ---- onExit();
从上面可以看出以下几点,
同样的,我们再来看一下replaceScene切换场景,scene的生命周期
假设scene A是活动场景,现在我们用scene B来replaceScene替换A,A和B的生命周期是这样的:
B ---- init();
A ---- onExit();
B ---- onEnter();
B ---- onEnterTransitionDidFinish();
此时B replace A回来的调用跟上面一样,如下:
A ---- init();
B ---- onExit();
A ---- onEnter();
http://blog.csdn.net/tonny_guan/article/details/28121973
-----------------华丽的分割线----------------
当使用replaceScene切换场景的时候,在游戏所占有的内存是当前内存峰值时多少哪,很可怕的 时当前场景的内存值,加上下一个场景的资源所占用的内存值。
原因。。。。
在每个场景里面会有一个init函数,一个onEnterTransitionDidFinishOnexit函数,实现一些初始化工作,在之后执行,在场景退出时回收时分配的资源。在调试时发现一个很有趣的现象,那就是从场景一切换到场景二时,在切换的一瞬间会内存会非常高,但是过了一段时间后,内存会回到一个平稳的状态,譬如切换时内存会达到80M,切换过后内存会降到50M。分析原因,怀疑是上一个场景的内存还没有释放,然后这一个场景的内存已经分配,所以两个叠加在一起,就比较高了。所以我便在第一个场景的函数中加一个断点,在第二个场景的和函数中各加一个断点,然后运行程序,发现程序先到第二个场景的中,然后再回到第一个场景的中,最后才到第二个场景的中。我才恍然大悟,原来在场景切换时,不是马上会执行第一个场景的函数,而是先到第二个场景的中加载资源,然后回到第一个场景中释放资源,最后才是到中。 内存中的峰值很惊人。
方案一, 将必要的资源放在onEnter 中处理,其他的资源 放在onEnterTransitionDidFinish处理。
方案二,给场景切换添加一个过度场景,现在主流的rpg ,或者横版格斗的游戏都已经这样处理。 因为资源量比较大,这样处理高效并且安全。
--总结