在捕鱼切换场景时发现会出现内存不足的现象,看了下代码发现了个问题。我们先看看代码
- [[CCDirector sharedDirector] runWithScene:[ SceneA scene]];
- [[CCDirector sharedDirector] replaceScene:[ SceneB scene]];
假设CCDirector以SceneA为起始场景,现在要替换为SceneB。那么:
将会触发一系列的方法被调用,如下: 1. scene: SceneB 2. init: SceneB 3. onEnter: SceneB 4. Transition 发生. 5. onExit: SceneA 6. onEnterTransitionDidFinish:SceneB7. dealloc: SceneB 当一个scene被搬上“台面”,它会收到onEnter,SceneB会收到onExit,最后交替完成在台面上的SceneA收到onEnterTransitionDidFinish。从中我们可以看出,只有当登台的SceneA完全加载完成,下场的SceneB才会被释放。两个scene在某一帧是同时处在内存里的,内存自然会表示压力山大。 |
再看看cocos2d-x的源代码
- void CCDirector::replaceScene(CCScene *pScene)
- {
- assert(pScene != NULL);
-
- unsigned int index = m_pobScenesStack->count();
-
- m_bSendCleanupToScene = true;
- m_pobScenesStack->replaceObjectAtIndex(index - 1, pScene);
-
- m_pNextScene = pScene;
- // replaceScene赋值m_pNextScene,以致drawScene会触发setNextScene函数。
- }
-
- void CCDirector::setNextScene(void)
- {
- ···;
- if (! (newSceneType & ccTransitionScene))
- {
- if (m_pRunningScene)
- {
- m_pRunningScene->onExit(); //即 5. onExit: SceneA
- }
- }
- ···;
- }
释放一些new出来的对象,应该在onExit()里面delete掉。之前不知道原理,new出来的对象在destroy()里面delete,结果就是运行时弹窗口了…