在捕魚切換場景時發現會出現內存不足的現象,看了下代碼發現了個問題。我們先看看代碼
- [[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:SceneB
7. 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,結果就是運行時彈窗口了…