Проект Cocos2D со многими сценами не освобождает память должным образом - PullRequest
5 голосов
/ 11 февраля 2012

У меня большая проблема, и я не очень хорошо понимаю, почему это происходит.Это тот случай:

  • Отличный проект в Cocos2D с 10 сценами.Каждая сцена - это страница книги с огромными спрайтами.Он использует реализацию Kobold2D 1.0.2.
  • Каждая страница имеет общие объекты в одноэлементном классе, чтобы поместить общие меню через LayerColor.
  • Спрайты - это TexturePacker в PVR.CCZ RGBA4444 и в памяти iPad - около 16-20 МБ для каждой загруженной таблицы.
  • Я использую CCTransitionTurnPage для replaceScene для одного следующего.
  • В методе init каждой страницы (класса) загрузите текстуру и FrameFile.
  • В методе onExit каждой страницы (класса) выгрузите текстуры и frameFile.Я использовал dumpCachedTextureInfo и говорит, что текстуры отлично загружаются и выгружаются из памяти.
  • Конечно, я удаляю от ребенка все объекты.Все мои спрайты являются общими переменными, объявленными в разделе интерфейса в .h, потому что мне нужен доступ к ним в каждом методе класса.
  • Мой проект сделан с интеграцией Kobold2D в проекте ARC (но вы знаете, чтоВ прикрепленном проекте Kobold2D ARC не включен для проблемы совместимости)

Дело в том, что когда я запускаю проект, все кажется идеальным, но память увеличивается для каждой сцены (страницы), которую я сделал.Страница 1: 30 МБ., Страница 2: 40, Страница 3: 54, Страница 4: 65 ... После 7 или 8 сцен приложение Instruments, Xcode или iPad вешает приложение без каких-либо сообщений (кроме Инструментов с окончательным предупреждением о нехватке памяти),

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

Ответы [ 2 ]

10 голосов
/ 05 марта 2012

У меня была похожая проблема с сохранением памяти и отсутствием утечек в инструментах. Я не мог - (void) dealloc даже вызываться до тех пор, пока я не напишу следующее в файл .m каждой сцены:

-(void) onExit {
    //unschedule selectors to get dealloc to fire off
    [self unscheduleAllSelectors];
    //remove all textures to free up additional memory. Textures get retained even if the sprite gets released and it doesn't show as a leak. This was my big memory saver
    [[CCTextureCache sharedTextureCache] removeAllTextures];
    [super onExit];
}

После этого моя память освобождалась после каждого вызова replaceScene :. Надеюсь, это вам пригодится.

3 голосов
/ 10 апреля 2013

После нескольких месяцев работы я усвоил самый важный урок по Cocos2D.Сохранение увеличивается на единицу, когда вы помещаете какой-либо объект CCNode в CCArray или NSArray или NSDictionary ... Это означает, что вы должны освободить объекты из этих объектов до того, как CCLayer или CCScene dealloc.

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

Тем временем, на - (void) onExit вы должны удалить всепланировщик из экземпляра.Не только сам планировщик.Не забудьте остановитьAllActions на любом CCNode.Но, осторожно, потому что остановка действий из CCNodes (Sprites или что-то) должна быть на очистке, перед любыми removeAllObjects.

И помните: если CCLayer или CCScene не удаляются должным образом, SimpleAudioEngine также не будет выпускать звук.1007 *

...