Как увеличивается использование памяти при загрузке текстур в Cocos2d (с использованием листов спрайтов)?

Я создаю приложение, которое использует Cocos2d для создания карты контента (технически большое дерево в смысле теории графов). Каждый узел представлен спрайтом со своей собственной текстурой, а листовые узлы имеют вторую текстуру «нажатой кнопки». Кроме того, некоторые узлы представляют собой анимацию PNG. У меня есть один лист спрайтов, содержащий около 130 текстур узлов, и 3 других листа спрайтов для анимации. В сумме эти 4 файла составляют всего около 18,4 МБ.

Если я запускаю приложение и НЕ запускаю часть cocos2d (т. е. вообще никогда не запускаю фреймворк и, следовательно, никогда не загружаю текстуры), приложение работает примерно на 10 МБ. Когда я загружаю Cocos2d и эти листы спрайтов, объем памяти увеличивается до 90 МБ.

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

Это нормально для cocos2d? Поскольку сами изображения не такие большие, использует ли он так много памяти из-за количества спрайтов? Есть ли способы уменьшить объем памяти? Я в растерянности и очень сильно под прицелом...


person devdavid    schedule 02.08.2011    source источник


Ответы (1)


Оказывается, эффективность, которую вы получаете, упаковывая спрайты вместе в большие листы спрайтов, измеряется временем рендеринга, а не сохраненной памятью. Независимо от того, в UIImage или в среде OpenGL, такой как Cocos2d, когда вы загружаете изображение, объем памяти, который он занимает, равен ширине x высоте x байтам на пиксель. Таким образом, png-изображение размером 2048x2048 занимает в памяти 2048x2048x4 байта (12 МБ).

Чтобы сохранить память в этом случае, я просто должен загружать вещи по мере необходимости и выгружать их, как только они не нужны. Теперь хитрость заключается в том, чтобы выяснить, где и когда загружать, чтобы пользователь никогда не видел заикания. ВЕСЕЛЬЕ!

person devdavid    schedule 03.08.2011