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

来源:互联网 发布:网络招聘平台 编辑:程序博客网 时间:2024/05/02 19:49

昨晚在捕鱼切换场景时发现会出现内存不足的现象,看了下代码发现了个问题。我们先看看代码

[[CCDirector sharedDirector] runWithScene:[ SceneA scene]];[[CCDirector sharedDirector] replaceScene:[ SceneB scene]];

假设CCDirectorSceneA为起始场景,现在要替换为SceneB。那么:

将会触发一系列的方法被调用,如下:
1. scene:                    
 SceneB
2. init:                      
SceneB
3. onEnter:                   SceneB
4. Transition 发生.
5. onExit:                    
SceneA
6. onEnterTransitionDidFinish:SceneB

7. dealloc:                   SceneB

 

当一个scene被搬上台面,它会收到onEnterSceneB会收到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,结果就是运行时弹窗口了