Кейс: как уменьшить размер графики внутри APK-пакета на 86%?
Разработчик Милан Бабусков (Milan Babuskov) рассказал об оптимизации размера графики внутри APK-пакета. Перевели статью и делимся.
Бабусков — основатель собственной инди-студии Bigosaur. В процессе создания карточного баттлера Gods of Sparta разработчик столкнулся с проблемой. Из-за большого разнообразия устройств на Android он принял решение создать 6 графических ассетов разного размера. Однако это привело к тому, что финальный вес APK-пакета превысил бы 300 MБ.
Лимит на максимальный размер файлов APK — 100 МБ. Остальные пришлось бы подгружать дополнительно. Разработчик признается, что сам ненавидит ситуации, когда игра после скачивания отнимает время и загружает еще сотни мегабайтов. Поэтому он начал искать подход, который избавил бы будущих пользователей проекта от этих проблем.
После поиска разных способов разработчик решил сохранить непрозрачные текстуры отдельно в формате JPG, а прозрачные — в PNG. Это позволило бы сэкономить место. Основной минус такого подхода — в том, что 90% графики в игре были как раз прозрачными. Кроме того, края карт были скругленными. Поэтому Бабусков разделил каждую карту на два изображения — рамку и содержимое (см. рисунок).
В игре было 4 вида карт, и каждому виду принадлежал только один тип рамки. Содержимое всех карт было разным, но тут прозрачность уже не требовалась. В итоге вместо 126 карт с PNG-текстурой разработчик получил 126 карт в формате JPG и 4 рамки в формате PNG.
Следующее, на чем получилось сэкономить место — «перевернутые» изображения. В процессе игры пользователь перекладывает карты из одной части экрана в другую. В результате изображение на карте зеркально переворачивается. Для того, чтобы не хранить 2 вида изображений, разработчик использовал функцию AtlasRegion.flip() [игра написана на java, — прим. редакции]. Для того, чтобы не переворачивать все изображение в формате JPG целиком, он задал область, которая требует изменений, с помощью setRegionY и setRegionHeight. Затем сохранил то, что получилось в группе с основными изображениями карт, и после этого просто прописывал в коде «скрыть» или «показать» полученное изображение.
В результате конечный размер файлов APK составил 42МБ. Это на 86% меньше, чем то, что разработчик рассчитывал получить в начале.
Источник: http://gamasutra.com