歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> cocos2d-x的CCDirector::replaceScene(CCScene *pScene) 使用注意

cocos2d-x的CCDirector::replaceScene(CCScene *pScene) 使用注意

日期:2017/3/1 10:41:43   编辑:Linux編程

在捕魚切換場景時發現會出現內存不足的現象,看了下代碼發現了個問題。我們先看看代碼

  1. [[CCDirector sharedDirector] runWithScene:[ SceneA scene]];
  2. [[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的源代碼

  1. void CCDirector::replaceScene(CCScene *pScene)
  2. {
  3. assert(pScene != NULL);
  4. unsigned int index = m_pobScenesStack->count();
  5. m_bSendCleanupToScene = true;
  6. m_pobScenesStack->replaceObjectAtIndex(index - 1, pScene);
  7. m_pNextScene = pScene;
  8. // replaceScene賦值m_pNextScene,以致drawScene會觸發setNextScene函數。
  9. }
  10. void CCDirector::setNextScene(void)
  11. ···;
  12. if (! (newSceneType & ccTransitionScene))
  13. {
  14. if (m_pRunningScene)
  15. {
  16. m_pRunningScene->onExit(); //即 5. onExit: SceneA
  17. }
  18. }
  19. ···;
  20. }
釋放一些new出來的對象,應該在onExit()裡面delete掉。之前不知道原理,new出來的對象在destroy()裡面delete,結果就是運行時彈窗口了…
Copyright © Linux教程網 All Rights Reserved