歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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

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