Memory management cocos2d控制器流控制:在推送场景后替换场景。那场戏怎么办? //尽量避免一大堆推送场景 -(void)主菜单() { //等 [[CCDirector sharedDirector]推送场景:游戏场景]; } //堆栈: // . 游戏

Memory management cocos2d控制器流控制:在推送场景后替换场景。那场戏怎么办? //尽量避免一大堆推送场景 -(void)主菜单() { //等 [[CCDirector sharedDirector]推送场景:游戏场景]; } //堆栈: // . 游戏,memory-management,cocos2d-iphone,Memory Management,Cocos2d Iphone,只需使用整个场景即可 推和弹出场景仅对快速间歇(即显示设置屏幕)有意义。您将希望避免推送场景的任何场景,在这种场景之后可能会调用replaceSecene。跟踪当前场景堆栈变得非常复杂和不方便(Director未公开任何方便的方法来管理场景堆栈)。在内存耗尽之前,很容易意外地不断增加推送场景的堆栈 简单的回答是:尽可能避免弹出和推送场景。如果您需要保持状态,请创建一个Singleton类,该类存储替换场景时需要持久化的值。我只是被这个(cocos2d-x,但概念相同)咬了一口。我现在的经验法则是

只需使用整个场景即可

推和弹出场景仅对快速间歇(即显示设置屏幕)有意义。您将希望避免推送场景的任何场景,在这种场景之后可能会调用replaceSecene。跟踪当前场景堆栈变得非常复杂和不方便(Director未公开任何方便的方法来管理场景堆栈)。在内存耗尽之前,很容易意外地不断增加推送场景的堆栈


简单的回答是:尽可能避免弹出和推送场景。如果您需要保持状态,请创建一个Singleton类,该类存储替换场景时需要持久化的值。

我只是被这个(cocos2d-x,但概念相同)咬了一口。我现在的经验法则是,如果退出屏幕的唯一方法是弹出场景,则只推一个场景。如果您想从推送的场景转到另一个场景,则应使用ReplaceSecene。

感谢您的重播Steffen。事实上,我在游戏菜单中使用了pop和push。您可以选择继续游戏或退出。如果resume pop else replace。@zeiteisen,如果不resume,您将
ReplaceSecene
,对吗?但在这种情况下,它只会替换游戏菜单中的
,对吗?然后,在游戏菜单中按下
的场景将保留在内存中…因为这个原因,较新的cocos2d版本有popToRootScene
// TRY TO AVOID A BIG STACK OF PUSHED SCENES
-(void) mainMenu()
{
    // etc
    [[CCDirector sharedDirector] pushScene: gameScene];
}
// stack:
//   . game  <-- running scene
//   . mainMenu

-(void) game
{
    [[CCDirector sharedDirector] pushScene: gameOverScene];
}
// stack:
//   . gameOver  <-- running scene
//   . game
//   . mainMenu

-(void) showGameOver
{
    [[CCDirector sharedDirector] pushScene: hiScoreScene];
}
// stack:
//   . scores  <-- running scene (4 pushed scenes... expensive)
//   . gameOver
//   . game
//   . mainMenu

-(void) toMainMenu
{
    [CCDirector sharedDirector] replaceScene: mainScene];
}
// stack:
//   I don't know...