#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