cocos2d-x용 CCDirector:::CCScene(CCScene*pScene) 사용 참고 사항

1611 단어
어젯밤 어획 전환 장면에서 메모리 부족 현상이 나타나 코드를 보니 문제가 하나 발견됐다.코드를 먼저 볼게요.
[[CCDirector sharedDirector] runWithScene:[ SceneA scene]];
[[CCDirector sharedDirector] replaceScene:[ SceneB scene]];

CCDirector가 SceneA를 시작 장면으로 가정하고 이제 SceneB로 대체합니다.그러면:
일련의 방법이 호출될 것입니다. 다음과 같습니다.scene:                     SceneB 2. init:                      SceneB 3. onEnter:                   SceneB 4. Transition이 발생합니다.5. onExit:                    SceneA 6. onEnterTransitionDidFinish:SceneB 7. dealloc:SceneB가'테이블'로 옮겨지면 onEnter를 받고, SceneB는 onExit를 받고, 마지막에 테이블에 있는 SceneA를 교체해서 onEnterTransitionDidFinish를 받는다.무대에 오른 SceneA가 완전히 로드될 때만 다음 SceneB가 풀릴 수 있음을 알 수 있다.두 개의 씬이 어느 프레임에서 동시에 메모리에 존재하면 메모리는 자연히 압력산이 크다는 것을 나타낸다.
코코스2d-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 () 에서 삭제해야 합니다.원리를 몰랐는데 new에서 나온 대상이destroy () 안에서 delete를 했는데, 결과적으로 실행할 때 창을 튕겼습니다.

좋은 웹페이지 즐겨찾기