Welcome 微信登录

首页 / 操作系统 / 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:SceneB7. 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,结果就是运行时弹窗口了…