2013-10-05 3 views
1

Я разрабатываю приложение в cocos2d. Архитектура приложения довольно проста: Главное меню, из которого вы можете выбрать один из шести подменю. После запуска подменю. В главном меню много текстур в высоком разрешении (для Retina iPads) после загрузки всех текстур потребовалось приблизительно 408 МБ (максимум 450 МБ, потому что я использую метод removeUnusedTextures) на Retina iPad.Cocos2d loading textures memory issue

И теперь у меня есть два сценария оптимизации текстур:

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

Недостаток: при загрузке текстур, когда приложение замораживается на мгновение для загрузки данных с диска. Невозможно загрузить текстуры с использованием GCD, потому что не все классы cocos2d являются потокобезопасными, а кокос ворчит, что все текстуры не используют один и тот же идентификатор (CCSprite is not using the same texture id). (Примечание: я загружаю * .pvr.ccz файлы с помощью CCSpriteBatchNode

Во-вторыхов. Загрузки всех текстур в начале сцены

Минус: при переключении между сценами в течение некоторого времени в памяти есть ресурсы из двух сцен (меню и подменю, особенно при переходе из подменю в главное меню). Из-за этого объем памяти увеличивается до 600 МБ, а iOS убивает приложение, краш, армагеддон.

Как решить эту проблему? пытался найти что-то в Интернете, но без везения.

P.S Я использовал TexturePacker для оптимизации текстуры как можно лучше.

ответ

1

Чтобы избежать проблемы с двумя сценами в памяти, вы можете просто добавить сцену перерыва (загрузки) между ними, которая ничего не делает, кроме отображения «Загрузка» текста или графики. Когда вы переключаетесь на сцену загрузки, старая сцена имеет время для освобождения, прежде чем загружать следующую.

Вы также можете сократить использование памяти текстуры пополам за счет уменьшения глубины цвета с 32-бит до 16 бит. В частности, на изображениях Retina разница с правильным цветовым сглаживанием трудно, если не невозможно разобрать.

Также вы можете загружать текстуры в фоновом режиме с использованием метода loadImageAsync CCTextureCache. Но вам все равно придется дождаться загрузки текстуры, прежде чем вы сможете создать спрайт, используя эту текстуру, чтобы вы ничего не выиграли.

+0

К сожалению, когда я использую '[CCTexture2D setDefaultAlphaPixelFormat: kCCTexture2DPixelFormat_RGB5A1];' (из вашего сообщения в блоге) графика выглядит не очень хорошо ... То же самое происходит, когда я использую этот параметр в TexturePacker. Я экспериментирую с PVRTC4 (альфа/нет альфа), но когда перемещение персонажа можно увидеть некоторые артефакты ... – lvp