Cocos2D управление памятью сцены - PullRequest
1 голос
/ 24 января 2012

У меня вопрос по Cocos2D.У меня есть 2 сцены в моей игре, у обеих на сцене много спрайтов.Что случилось, когда я заменил одну сцену и загрузил другую?Все спрайты удаляются автоматически, или это забирает воспоминания и будет освобожден, когда я выпущу их на месте событий сцены?

Я не могу понять, как управлять памятью в этом состоянии, поэтому любой может объяснитьМне и еще одной вещи важно, чтобы мы сохранили спрайт при загрузке его на сцену.

Ответы [ 3 ]

6 голосов
/ 25 января 2012

В момент, когда вы вызываете replaceScene, обе сцены будут существовать в памяти в течение короткого периода времени! Если вы используете CCSceneTransition, то обе сцены будут находиться в памяти на время перехода.

Поток выглядит следующим образом:

  • сцена A запущена
  • вызов CCDirector заменяет сцену на сцену B
  • сцена B инициализирована, может загружать спрайты и т. Д.
  • сцена A освобождается и память освобождается

Вы можете реализовать метод -(void) cleanup в сцене, чтобы удалить большую часть ее содержимого перед изменением сцены, и вы можете отложить загрузку нового содержимого в метод -(void) onEnter { [super onEnter]; }.

Лично я нахожу лучший подход в этом сценарии - сцена «загрузки», сцена, которая находится между двумя сценами (она может даже не работать более нескольких миллисекунд). Это дает время первой сцены, которое нужно освободить до инициализации следующей сцены.

0 голосов
/ 24 января 2012

, если вы делаете

CCSprite* sprite = [CCSprite spriteWithFile:@"test.png"];

без сохранения или чего-либо необычного, когда вы переключаете / переводите сцену, все дочерние элементы этой сцены (в этом примере, sprite, будут автоматически освобождены. Вы не станете владельцем объекта.

Но если вы скажете, если вы берете право собственности на объект, например:

hero = [[CCSprite spriteWithFile:@"hero.png"] retain];
// or
hero = [[CCSprite alloc] initWithFile:@"hero.png"];

тогда вам нужно будет выпустить его в свой dealloc

0 голосов
/ 24 января 2012

Все спрайты освобождаются после загрузки новой сцены в память ... если только вы не сохранили спрайты.

...