Оптимизация плиточных карт в cocos2d-iphone

#objective-c #cocos2d-iphone

#objective-c #cocos2d-iphone

Вопрос:

В моей игре cocos2d для iphone есть плиточные карты. Текстуры наборов плиток довольно большие. У меня получилось около 5 наборов листов, и каждый из них имеет размер 2048×2048 (сетчатка).

Мои карты размером около 80×80. У них около 8 слоев, и каждый из них, очевидно, использует один набор листов.

Частота кадров падает (иногда она достигает 30. Я знаю, что 30 довольно приемлемо, но все же я хочу 50 ).

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

Итак, как насчет того, чтобы разделить мои текстуры набора листов на гораздо меньшие наборы листов (например, 1024×1024 каждый)? Это позволит мне использовать гораздо больше слоев для моих карт, верно?

Есть ли какие-либо другие советы по созданию больших плиточных карт на дисплее retina?

Ответ №1:

Текстура с разрешением 2048×2048 и 32-разрядными цветами равна 16 МБ (!) памяти. В пять раз больше, чем 80 МБ памяти только для текстур. Ой! Для относительно крошечной карты (80×80) это огромный объем текстурной памяти.

Первым шагом оптимизации было бы использование текстур PVR, если вы действительно не можете уменьшить количество наборов плиток или изображений в них. Вы несколько потеряете качество изображения, но потребление памяти значительно снизится, а производительность рендеринга PVR-текстур станет намного лучше. Конечно, при работе с Tiled вам придется использовать (предположительно) текстуру PNG, которую вы затем конвертируете в PVR для использования в проекте, например, с помощью TexturePacker.

8 слоев плиток могут быть довольно объемными, но это зависит от того, как вы их используете и сколько плиток каждого слоя фактически отрисовано. Попробуйте это: установите для всех слоев, кроме одного, значение visible = NO. Затем снова включайте слои один за другим и посмотрите, как это влияет на частоту кадров.

Наконец, вы должны знать, что реализация tilemap в Cocos2D крайне неэффективна после определенного количества плиток. Предпринимались попытки улучшить средство визуализации tilemap, например, этот ( MXTILEDMAP), и, возможно, стоит попробовать.

Комментарии:

1. Мои наборы листов составляют около 3,6 МБ. Если только вы не имеете в виду что-то вроде… Оперативная память? Я попробую использовать PVR и вернусь позже. Спасибо.

2. Оперативная память = (произвольный доступ) память … 3,6 МБ — это размер файла, который я предполагаю? Это относится только к общему размеру загружаемого приложения, но не к использованию памяти во время выполнения.

3. Один вопрос: сколько оперативной памяти потребуется для текстуры 2048×2048 с 8-битными цветами?

4. В iOS нет поддержки 8-разрядных цветных текстур (т.Е. цветовой палитры). Таким образом, даже если вы уменьшите разрядность цвета, вам все равно придется сохранить его по крайней мере в виде 16-разрядного PNG или PVR. Вот список форматов файлов изображений и время их загрузки: learn-cocos2d.com/2011/11 /…

Ответ №2:

У меня была такая же проблема. Мое решение — просто конвертировать файлы .png в .pvr.ccz, и размер файла и объем памяти значительно уменьшатся. Вот мои шаги:

  1. используйте TexturePacker для преобразования файлов tileset (png-файлов) в pvr.ccz. Убедитесь, что это отображение 1: 1 (одинакового размера, без поворота, без заполнения границ, без обрезки …), и они должны быть одинакового размера (например, 2048 x 2048)

  2. откройте ваш файл .tmx и измените путь к файлу png на ваш pvr-файл.ccz.

вот и все! В моем случае это работает для cocos2d-x. До изменения моя игра занимала 106 МБ памяти, и только ~ 90 МБ после изменения, и это только для 1 текстуры с набором плиток.