iPad падает, когда iPhone 3G и iPhone4 не работают - PullRequest
0 голосов
/ 10 января 2012

Я думаю, что это проблема с памятью, но я не уверен, что здесь делать.

Моя проблема:

Я почти закончил игру, используя cocos2d для iphone,с помощью retina gfx я сделал приложение универсальным и внес коррективы, чтобы оно правильно работало на iPad, в основном я использую спрайт-листы сетчатки на ipad с несколькими дополнительными изображениями (содержащимися в спрайт-листах -hd) для покрытиякрая экрана и т. д.

Все работает нормально, iPad, когда в игре работает со скоростью 60 кадров в секунду, как на iphone4 (я обычно получаю около 40-50 кадров в секунду на iphone3g), однако иногда, послеПриблизительно через 5 минут перехода между меню на iPad (обычно, но не всегда, после выгрузки игрового движка и возврата к меню) игра падает.

В отладчике я получаю 'Полученопредупреждение о памяти. ', вскоре после (не сразу), когда загружается новая таблица спрайтов или графика (не создание спрайта, а фактическая загрузка новой текстуры в память),p закрывается, и все, что я получаю в консоли, это «(gdb)» без отслеживания стека.

Я изо всех сил пытаюсь найти решение, при переходе от игрового движка к меню у меня появляется экран загрузки, который в основном создается с использованием 1 полноэкранного изображения, а некоторый текст, все другие текстуры, спрайтфреймы и предварительно загруженный soundfx затем удаляются из памяти перед загрузкой чего-либо нового.

Я попытался запустить ipad сутечки и выделения в инструментах, но как только приложение загружается, инструменты каждый раз выходят из строя.

Кто-нибудь случайно узнает, каков максимальный объем памяти для приложения ipad, до его закрытия (я думал, чтоПо крайней мере, получите 3 предупреждения, а не 1), и сколько листов 2048 x 2048 это тоже равняется?

РЕДАКТИРОВАТЬ: (Обнаружена новая причина иррационального исчезновения памяти!)

Итак, спустя несколько недель,Я наткнулся на это сообщение на форумах cocos2d.

http://www.cocos2d -iphone.org / forum / topic / 31092

Эта ошибка в iOS5, вероятно, будетГлавная причинаиз моих неприятностей, все советы и предложения помогли, по моему мнению, сжать мое приложение в целом.

Ответы [ 4 ]

2 голосов
/ 11 апреля 2012

Для потребления меньше памяти.Используйте CCTextureCache.Помните, что Cocos2D всегда сохраняет изображения с шириной / высотой, равной степени 2. Поэтому, если ваше изображение 513 пикселей, оно будет использовать изображение с 1024 пикселями.

CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:@"randomImage.png"];
CCSprite *randomImage = [CCSprite spriteWithTexture:texture];

Для сохранения еще большего объема памяти вы можетеизучить использование текстурных атласов.Всякий раз, когда вы переключаетесь в меню или игру, вы можете вызывать removeUnusedTextures (или когда вызывается вне памяти).

[[CCTextureCache sharedTextureCache] removeUnusedTextures];

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

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
1 голос
/ 11 апреля 2012

По-видимому, звучит так, как будто предупреждение о памяти вызывает двойной отпуск.

Первое, что нужно сделать здесь, это включить объекты Zombie. Раньше вы устанавливали NSZombieEnabled в аргументах своей цели. Совсем недавно Xcode добавил поддержку пользовательского интерфейса для зомби. Это можно найти под:

Управление схемами ...> Изменить ...> Диагностика> Включить объекты-зомби

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

При тестировании в симуляторе возможно генерировать предупреждения памяти вручную. Это можно найти под:

Симулятор iOS> Аппаратное обеспечение> Предупреждение о симуляции памяти

Альтернативой является добавление действия в ваш пользовательский интерфейс, чтобы просто выделить больше памяти, которое можно использовать до тех пор, пока не произойдет сбой. Достаточно простого вызова malloc:

- (IBAction)simulateMemoryLeak
{
    malloc(1024 * 1024 * 10); // Leak 10MB of memory.
}

Сбои инструментов трудно диагностировать, но я обнаружил, что чистая переустановка Xcode в прошлом исправляла для меня проблемы сбоев инструментов.

Обратите внимание, что Instruments использует для запуска конфигурацию Release , тогда как для нормальной отладки используется конфигурация Debug , поэтому убедитесь, что вы можете работать в конфигурации Release как правило, прежде чем пытаться бежать с инструментами.

Использование графики Retina для iPad займет большой объем памяти, поэтому убедитесь, что вы выгружаете UIImageView розеток соответствующим образом.

В частности, убедитесь, что вы понимаете жизненный цикл View Controller и выгружаете точки просмотра в viewDidUnload (вызывается при нехватке памяти), а не только в dealloc.

View Controller Lifecycle

Чтобы помочь в дальнейшей диагностике, попробуйте включить дополнительную информацию о том, как вы строите свой пользовательский интерфейс меню (вы заявляете, что это, вероятно, является причиной сбоя) и как вы управляете памятью (используйте ARC, использование авто-релизных пулов и т. д.)

0 голосов
/ 11 апреля 2012

Google указал мне в направлении этой статьи.

http://www.raywenderlich.com/2361/how-to-create-and-optimize-sprite-sheets-in-cocos2d-with-texture-packer-and-pixel-formats

Установка различных спрайтов в формат пикселей RGBA4444, похоже, прекратил сбой.Я могу только предположить, что я достиг предела физической памяти iPad со спрайтами, которые я загружал в память.

0 голосов
/ 11 апреля 2012

У вас есть метод viewDidUnload, который выпускает то, что вам все еще нужно?Это будет вызвано, когда вы получите предупреждение памяти, поэтому вы должны быть осторожны, что вы освобождаете.Просто используйте его, чтобы высвободить материал, который можно перезагрузить, когда он вам понадобится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...