управление потоком cocos2d director: замена сцены после push-сцены. Что происходит с перемещаемой сценой?

#memory-management #cocos2d-iphone

#управление памятью #cocos2d-iphone

Вопрос:

 // 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...
  

Я хочу уничтожить все сцены в стеке после replaceScene: call. Но я не знаю, происходит ли это.

Ответ №1:

Я был просто поражен этим (cocos2d-x, но та же концепция). Мое эмпирическое правило сейчас таково: выталкивать сцену только в том случае, если единственный способ выйти из этого экрана — открыть сцену. Если вы хотите перейти к другой сцене из той, которую вы нажали, вам следует использовать replaceScene вместо этого.

Ответ №2:

Просто используйте replaceScene повсюду.

Нажатие и всплывающие сцены имеют смысл только для быстрых перерывов, то есть для отображения экрана настроек. Вам следует избегать любого сценария, в котором вы нажимаете сцену, где за ней потенциально может последовать вызов replaceScene . Отслеживать текущий стек сцен становится очень сложно и неудобно (режиссер не предоставляет удобных методов, позволяющих управлять стеком сцен). Очень легко случайно продолжать увеличивать стопку вытесненных сцен до тех пор, пока у вас не закончится память.

Короткий ответ таков: по возможности избегайте появления и выталкивания сцен. Если вам нужно сохранить состояние, создайте одноэлементный класс, в котором хранятся значения, которые необходимо сохранять при замене сцен.

Комментарии:

1. Спасибо за ваш реплей, Штеффен. На самом деле я использую pop и push для внутриигрового меню. Вы можете возобновить игру или выйти. Если возобновить всплывающее окно, замените другое.

2. @zeiteisen, если не возобновить, ты replaceScene , верно? но в этом случае он заменяет только ваш in game menu , я прав? тогда сцена, которая выталкивается in game menu , останется в памяти…

3. по этой причине в более новых версиях cocos2d есть popToRootScene