前端之家收集整理的这篇文章主要介绍了
cocos2dx 中切换场景内存占用过高的处理,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
cocos2dx 中切换场景内存占用过高的处理
1、运行场景:
CCScene *pScene = HelloWorld::scene();
pDirector->runWithScene(pScene);
2、替换场景:
(1)
CCScene *pScene=SceneTestScene::scene();
CCDirector::sharedDirector()->replaceScene(pScene);
(2)
CCScene *pScene=SceneTestScene::scene();
CCDirector::sharedDirector()->pushScene(pScene);
(3)
CCScene *pScene=SceneTestScene::scene();
CCDirector::sharedDirector()->popScene(pScene);
假设scene A是活动场景,现在我们用scene B来pushScene替换A,A和B的生命周期是这样的:
B ---- init();
A ---- onExit();
B ---- onEnter();
B ---- onEnterTransitionDidFinish();
此时popScene,弹出scene B,函数调用如下:
B ---- onExit();
B ---- 析构函数被调用
A ---- onEnter(); (并不会执行sceneA的init函数 ,因为 pushScene的时候会执行sceneA的onExit函数释放一些资源, 当pop的时候,不会执行init函数加载需要的资源,出现为止的错误)
从上面可以看出以下几点,
1. A的析构函数始终未被调用,因此A一直在内存中。
2. 先执行B的init()函数,之后才调用A的onExit()方法,再之后才调用B的onEnter();所以初始化最好应该放在init中来初始化。在上一个场景退出之前初始化好后一个场景需要的资源。(内存占用过高出现在这里)
同样的,我们再来看一下replaceScene切换场景,scene的生命周期
假设scene A是活动场景,现在我们用scene B来replaceScene替换A,A和B的生命周期是这样的:
B ---- init();
A ---- onExit();
A ---- 析构函数被调用
B ---- onEnter();
B ---- onEnterTransitionDidFinish();
此时B replace A回来的调用跟上面一样,如下:
A ---- init();
B ---- onExit();
B ---- 析构函数调用
A ---- onEnter();
@H_
403_137@
1. 切换全屏场景的时候最好使用replaceScene而不是pushScene。
因为pushScene并不会销毁前一个scene,仅仅是将后一个scene按照堆栈的方式加入到前一个scene的上面。如果自身代码中内存管理写的不好的,利用pushScene很难发现该方面的问题,一旦崩溃定位都很难定位。replaceScene可以及早的将隐含的问题给暴露出来。
2. 尽量不要在onEnter里面初始化精灵Sprite
这个就和上一条有点关系了,如果使用了pushScene,那么再popScene的时候是不会调用前一个场景的init方法的(上一个界面的资源有的已经释放,这时出现未知的错误),所以有同学就喜欢把一些初始化放在onEnter里面,具体为什么不好,我们来看一下不同切换场景的时候,每个Scene的生命周期就知道了。