Как сжать игру покадровую анимацию до минимума на диске

19

Я разрабатывал такую ​​игру, как Age of empire (здания на карте), и для каждого здания у меня есть спрайт-лист для его анимации. Я использую покадровую анимацию для анимации здания (в любом случае не знаю ни о каком другом методе). Я заметил, что моя папка ресурсов становится очень большой из-за изображений, которые я в нее помещаю.

Как такие игры, как CoC и Age of Empires, сохраняют свой размер apk до 50 Мг? Я что-то здесь упускаю, когда дело доходит до разработки игр

Спасибо

РЕДАКТИРОВАТЬ: больше информации о проблеме, с которой я сталкиваюсь

У меня есть много анимационных объектов. Я выбрал этот путь, потому что он был самым быстрым и приносил желаемые результаты. По сути, каждое здание представляет собой анимационный чертеж, в котором его XML-файл ссылается на 8 элементов рисования (8 изображений = 8 файлов). Все они PNG из-за прозрачности. Поскольку у меня более 200 изображений, размер apk составляет 120 МБ (и я еще не закончил копирование половины файлов). Вот что подсказывает, должен быть способ решить это. Пожалуйста, помогите коллеге-разработчику

змея
источник
Сжатие изображений или отделение игрового контента от apk может быть то, что вы ищете.
Янош Турански
Вы имеете в виду файлы расширения? Проблема в том, что файлы расширения не имеют папок для рисования различной плотности. Это то, что делают игры? Я делаю покадровую анимацию (полное изображение здания). Или я совершенно не в том направлении
Снейк
На всякий случай я постарался помочь и поставил ответ, связанный с экономией места для ваших изображений. Тем не менее, ваш вопрос сбивает с толку: не ясно, хотите ли вы действительно знать методы, например, связанные с тем, «как игры, такие как CoC и Age of Empires, сохраняют свой размер apk ниже 50 Мг?» или если вы хотите просто проверить, есть ли меньше способов анимации, требующих меньше места на диске (как подсказывает ваш заголовок). Пожалуйста, уточните, чтобы я мог удалить свой ответ, если это так, а также чтобы вы могли получить более точные ответы.
И
@ И я отредактировал свой ответ, чтобы поразмышлять над проблемой дальше
Снейк,
2
Для Age of Empires это, вероятно, сочетание низкого разрешения (IIRC было разработано для 640x480) и индексированных изображений (не полный RGB).
user253751 20.11.15

Ответы:

24

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

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


Тем не менее, в аналогичной ситуации два решения, которые я видел (и использовал один раз) с точки зрения экономии места на диске, были:

1) объединить отдельные изображения в одно и то же изображение. Иногда это может помочь. Поэтому вместо того, чтобы сохранять 4 отдельных файла для каждого из следующих цветных квадратов, я сохраняю их все вместе в одном и том же изображении (и разделю их только по коду игры):

введите описание изображения здесь

В этом примере сохранение каждого в 4 различных файлах PNG составляет 1255 байт, в то время как один файл со всеми объединенными файлами составляет 451 байт. Конечно, насколько это может помочь, зависит от каждого конкретного случая, и вы должны проверить, может ли это помочь вам в зависимости от ваших изображений.

2) сжать папку ресурсов. Это часто может быть очень полезно для экономии места на диске. Затем, когда игра запускается, вы либо распаковываете, либо извлекаете нужное изображение из сжатого файла - в зависимости от используемого формата сжатия. Смотрите этот предыдущий ответ, который стал вики этого сайта: /gamedev//a/37649/72423

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

Для получения более подробной информации о сжатии: современный уровень сжатия изображений?


Наконец, вам также может быть интересно подумать, какие типы изображений использовать в каждой ситуации: какой формат изображения более эффективен при использовании памяти: PNG, JPEG или GIF?

MAND
источник
Спасибо за информацию. Странно, что вы смогли сократить размер файла пополам, поместив вещи в один файл. В конце дня я подумал, что это такое же количество пикселей и использованное пространство. Я отредактировал свой вопрос для лучшего ответа
Снейк
@ Змея Так что, учитывая сделанные вами изменения, я думаю, что мой ответ действительно может быть полезным. Объединение изображений + сжатие может значительно уменьшить размер вашей папки. Обе техники регулярно используются в некоторых типах игр. О конкатенации, это всегда удивительный трюк. Попробуйте сами: разместите изображения из последовательности одной анимации рядом друг с другом и сравните окончательный размер с суммой отдельных изображений. Тогда вы можете посмотреть, поможет ли это в вашем случае. Что касается сжатия, то для PNG это, как правило, менее эффективно, но все же стоит усилий, чтобы сократить размер вашей конечной папки
MAnd
@ Напомним одно замечание: конкатенация иногда не стоит или даже увеличивает окончательный размер. Но часто это может привести к желаемому снижению. Все зависит от ваших изображений
И
Я помню, как пробовал и технику, и снижение составило менее 10%. Я точно знаю, что сжатие не имеет значения с PNG, но я попробую объединение. Вот почему я спросил, как другие игры делают это, потому что, очевидно, у них намного больше графики, чем у меня
Снейк
Вы не должны быть в состоянии сжать папку, полную изображений. Изображения уже должны быть сжаты и не должны иметь много повторяющихся последовательностей. Если бы они это сделали, этот дополнительный уровень сжатия был бы частью кодека изображения ...
corsiKa
9

Я хотел бы предложить вам попробовать TexturePacker

  • Вы можете просто перетащить все свои изображения и получить их упакованными
  • Вы можете применять различное сжатие - например, использовать индексированные PNG, которые потребляют намного меньше памяти - до 70% меньше по сравнению со стандартным файлом PNG
  • Вы можете создать файл с данными, которые содержат имя + положение каждого из ваших зданий
  • бесплатной версии может уже хватить, чтобы создать спрайт листы для вас

Используете ли вы среду разработки игр, как AndEngine, Cocos2d-x или LibGdx? => Нет

Нужно ли загружать все изображения одновременно? Похоже, вы столкнетесь с огромными проблемами ОЗУ на целевых устройствах.


Обновление: Снейк прислал мне несколько изображений. Как и было обещано, они не станут здесь публичными, поэтому я сам создал немного искусства, чтобы продемонстрировать, как уменьшить использование памяти.

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

введите описание изображения здесь

По сути, упаковка полной анимации в лист - это большая трата памяти. Вы должны разделить статические и движущиеся части:

Статическая:

введите описание изображения здесь

Anim01:

введите описание изображения здесь

Anim02:

введите описание изображения здесь

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

Теперь перетащите изображения на TexturePacker и выберите следующие параметры

  • Формат данных: JSON-хэш (или XML, если вы предпочитаете это)
  • TrimMode: Trim (это создает прямоугольники)
  • Пиксельный формат: INDEXED 8bit - для создания 8-битных PNG (примерно на 70% меньше памяти)
  • Разрешить вращение: ложь
  • Введите имя файла для данных

TexturePacker упаковывает изображения

В результате вы получаете 2 файла: спрайт и файл описания JSON.

"house_anim_01.png":
{
    "frame": {"x":351,"y":246,"w":110,"h":79},
    "rotated": false,
    "trimmed": true,
    "spriteSourceSize": {"x":67,"y":8,"w":110,"h":79},
    "sourceSize": {"w":400,"h":400},
    "pivot": {"x":0.5,"y":0.5}
},

Важными частями являются frame и spriteSourceSize .

Кадр дает местоположение исходного спрайта в спрайт листа.

spriteSourceSize дает вам смещение для рисования изображения - части изображения, которые не учитываются из-за обрезки:

Простая процедура рисования псевдокода выглядит следующим образом:

drawImage(spritename, posX, posX)
{
    data    = sheetData[spritename]
    offsetX = data.spriteSourceSize.x
    offsetY = data.spriteSourceSize.y
    frameX  = data.frame.x
    frameY  = data.frame.y
    width   = data.frame.w
    height  = data.frame.h
    screen.draw(sheetImage, posX+offsetX, posY+offsetY, width, height)
}

Возможно, вам придется настроить расчет смещения в зависимости от точки поворота / начала координат в вашей графической системе. Приведенная выше подпрограмма предполагает систему координат, источник которой находится слева вверху.

Затем просто нарисуйте дом в 2 прохода:

draw("background", 100, 100);
draw("anim_01", 100, 100);

Вам не нужно заботиться о смещениях - поскольку изображения уже выровнены.

Андреас Лёв
источник
+1 за наблюдение об использовании оперативной памяти, которое игнорируют другие люди
Дэн Халм
@ Андреас, я проверю это. Спасибо. Не смейся надо мной, но я не использую двигатель. В основном это делается с помощью анимации и рисования, и это работает как шарм. Я не загружаю все изображения в память, иначе не получится. Он просто загружает изображения, необходимые для отображения на данный момент ... Как вы думаете, вышеупомянутое предложение будет работать со стандартным Android SDK?
Змей
1
Да, это будет. В TexturePacker есть 2 режима обрезки спрайтов: прямоугольники и многоугольники. Если вы используете изометрические изображения, вы можете получить большое преимущество от полигональных сеток с точки зрения упаковки. Вопрос в том, сможете ли вы нарисовать текстурированные треугольники или прямоугольники с маской. Если это не так, вы все равно можете использовать прямоугольники. Вы можете прислать мне несколько своих изображений, если хотите использовать Dropbox и отправить ссылку на -> службу поддержки на codeandweb. ком. Я не буду делиться ими - просто интересно посмотреть, что мы можем сделать, чтобы улучшить упаковку.
Андреас Лёв
@ AndreasLöw Мне очень жаль, я не получил уведомление о вашем комментарии. Я только что видел его. Я буду очень признателен за помощь. Я пришлю тебе кое-что, и, возможно, ты сможешь пролить свет на то, что я должен. ..тада застрять с чем-то, что у меня есть небольшой опыт, и, возможно, вы можете пролить свет. Я скоро свяжусь с тобой
Снейк,
7

Вот несколько указателей, которые вы можете использовать

  1. Постарайтесь убедиться, что все ваши фоновые и непрозрачные изображения не в формате PNG
  2. Постарайтесь, чтобы все анимации были в цикле, т. Е. Если анимация 1,2,3,4,5,6, постарайтесь сделать ее похожей на 1,2,3,4,3,2,1, где эти числа являются номером кадра анимации, это очень помогает
  3. если много изображений одинаковы и различаются только цвета (как правило, кнопки пользовательского интерфейса, анимация частиц, игровые монеты), попробуйте взять одно белое изображение и динамически изменить его цвет
  4. Попробуйте создать .apk только с теми изображениями, которые чрезвычайно важны, а затем загрузите все с сервера и сохраните в памяти телефона.

Я надеюсь, что эти указатели помогут

PS Я даю лишь обобщенную идею, так как не знаю, какой именно у вас игровой контент и извинения, если эти указатели бесполезны.

Кумар Саурабх
источник
Вы также можете: 1) сжать все ваши изображения 2) использовать плитки как можно чаще 3) объединить изображения, чтобы превратить их в большое изображение, и использовать это в качестве ультрафиолетовой карты для текстурирования
Энтони Раймондо,
Это отличные предложения. Спасибо. Я думаю, что самый важный момент - 4. Однако, если это так, то как мне поместить их в разные папки для рисования и ссылаться на них как R.drawable.image1? Вот где я запутался
Снейк
4

Многие игры не хранят свои графические ресурсы в .apk; они включают только «основы», такие как графика пользовательского интерфейса и код игры, и загружают оставшиеся ресурсы после установки игры. Это особенно актуально для игр, которые используют различные графические ресурсы в зависимости от разрешения вашего дисплея, чтобы не допустить наличия в .apk ресурсов как с низким, так и с высоким разрешением.

Вы должны взглянуть на оба варианта оптимизации, предоставляемые другими ответчиками, а также на то, будете ли вы в конечном счете обслуживать графику вашей игры отдельно от самого .apk.

Sandalfoot
источник
У меня нет проблем с получением графики с сервера (или даже файлов расширения), но как мне поместить их в папку drawable, чтобы я мог ссылаться на них по R.drawable.x Поскольку большинство моих (многие многие) xmls ссылаются на них, используя R .drawable
Змея
AFAIK, ты не можешь. Одним из обходных путей является сохранение хеш-таблицы имен файлов ресурсов, связанных с идентификаторами ресурсов, и использование AssetManager для захвата файлов на основе этих идентификаторов, но вам, возможно, придется переделать свои XML-файлы, если вы пойдете по этому пути.
Sandalfoot
4

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

Возможно, вам стоит взглянуть на 2D-анимацию: анимированные 3D-модели или спрайты с кадрами анимации? для некоторых дебатов по различным типам анимации. Это помогло мне оптимизировать мою игру. Кроме того, вы не сообщаете нам, какой API вы используете или какой движок вы используете. Уже одно это может изменить ситуацию: Android покадровая анимация PNG

Кроме того, имейте в виду, что если вы пойдете по пути сжатия, могут существовать важные различия между способами сжатия. В частности, существует довольно много различий между типами сжатия, и существуют некоторые специализированные дискуссии о том, какой маршрут является наиболее подходящим для мобильных устройств. Особенно, если принять во внимание, что для мобильных устройств использование памяти и загрузка процессора также имеют первостепенное значение. См .: http://www.gamasutra.com/blogs/AlexandruVoica/20130419/190833/Why_efficiency_is_key_in_texture_compression_standards_for_mobile_graphics.php?print=1

Bennton
источник
Спасибо, Беннтон, я новичок в разработке игр. Я разработал множество приложений, основанных на инструментах и ​​производительности. Но нет с играми. Итак, я делаю свою первую игру и не использую движок. Я использую только AnimationDrawables, и все работает отлично. Это как раз размер apk выходит из-под контроля
Змея
Беннтон, последняя предложенная тобой ссылка особенно интересна. Большое спасибо за то, что поделились этим! Обязательно посмотрите последний ответ из моего ответа, который также затрагивает проблему разного сжатия для разных типов файлов. На самом деле, кажется, что есть типы сжатия, которые лучше работают с уже сжатыми типами изображений, такими как PNG, или лучше с несжатыми типами изображений. Экспериментирование для каждого случая - это всегда лучший способ проверить, что лучше всего подходит для каждой ситуации.
MAND