Defold. Уменьшаем размер билда. App Manifest.

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

Есть две основных фичи движка, которые позволяют делать очень маленькие билды:

  • для бинарника — это модульность, которая достигается с помощью использования App Manifest;
  • для контента — это сжатие текстур, в частности WebP, который позволяет уменьшить размер текстур без потери качества.

В этот раз будем разбираться с модульностью.

Defold App Manifest

App Manifest — это конфиг файл, описывающий, какие именно библиотеки вы хотите использовать, а какие вы бы хотели исключить из билда. При сборке приложения этот файл отправляется на билд-сервер.  На его основе вам высылают бинарник движка с нужным содержимым под необходимые платформы.

Работать с конфигом очень  просто:

  1. Создаем файл some_name.appmanifest в папке проекта.
  2. Копируем в него нужную конфигурацию (где ее взять описано ниже).
  3. указываем путь к файлу в game.project в разделе native_extension в поле App Manifest.

Нужно понимать, что если у вас в проекте есть Native Extensions, то не используя эту возможность, получить реальный релизный билд на данный момент нельзя. Поэтому, если вам лень читать, но вы хотите релизную сборку, где будет отключено соединение с редактором  для логирования и другие дебаг функции, а так же sys.get_engine_info().is_debug будет возвращать false, то используйте при сборке релизного бандла следующий файл:

Стоит отметить, что если этот файл прописан в game.project при разработке игры и при этом у вас в проекте есть любой Native Extension, то в редакторе исчезнут логи (т.к. релизный билд не отправляет их в редактор), поэтому лучше  подключать этот файл непосредственно при сборке бандла для загрузки в магазин.

На данный момент опция App Manifest в документации помечена как «alpha state«, но я (и не только я) использую ее во всех своих играх и всё работает прекрасно. Пометка эта добавлена скорее из-за того, что все настройки приходится вносить руками, прописывать платформы и самому вспоминать, что использовал у себя в проекте, а что нет. В будущем обещают упростить этот процесс и сделать так, чтобы движок сам решал, какие модули вам нужны на основании того, что вы используете, но это не приоритетная задача по двум причинам: во-первых, чаще всего конфиг делается один раз  и больше об этом не вспоминаешь, во-вторых, есть несколько утилит, которые в этом помогают:

  • https://britzl.github.io/manifestation/ —  онлайн конструктор, где можно просто проставить галочки напротив нужных вам функций и получить готовый app manifest;
  • https://github.com/rgrams/stripping_manifest_maker — python скрипт для генерации app manifest, если вы хотите встроить генерацию в ваш CI процесс.

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

  • Exclude Physics — удаление физики — эта опция отключает как Box2d так и Bullet Physics Library;
  • Exclude Record — удаление встроенной функции записи видео;
  • Exclude Profiler — удаление встроенного профайлера;
  • Exclude Facebook — удаление Facebook SDK;
  • Exclude Sound — удаление звуковой системы;
  • Exclude Graphics — удаление отрисовки;
  • Exclude Input — удаление системы пользовательского ввода;
  • Release — создание релизной сборки.
  • Make headless — то же самое, что Exclude Record + Exclude Sound + Exclude Graphics + Exclude Input. Данная опция нужна, если вы хотите использовать   движок на сервере, для повторения логики клиента.

Пример.

Пример использования на одной из моих игр с таким вот конфигом (кликните, чтобы посмотреть):

iOS. До: 5.46 Mb, после: 4.51Mb. Размер билда меньше на 0.95Mb. Для такой маленькой игры это ~17%.

Android. До: 3.06 Mb, после: 2.58 Mb. Размер билда меньше на 0.48Mb или ~16% в моей игре (скриншот потерялся, к сожалению).

HTML5 (gzip) тут я замерял только основной js файл. До: 1.30Mb, после: 0.89Mb. Размер билда меньше на 0.41Mb или ~30% в моей игре.

Выводы

Да, экономия от 0.41Mb до 0.95Mb не выглядит впечатляющей. Но тут нужно учесть следующее:

  • масштабы проекта — на примере маленькой игры видна экономия от 16% до 30% размера, что весьма неплохо;
  • платформа — если это html5 проект, то есть площадки с жесткими ограничениями по размеру игры в 3Mb — 5Mb, там эти 400Kb могут очень пригодиться;
  • дело не только в размере билда. Меньший размер бинарника — это еще и более быстрая загрузка, экономия оперативной памяти и ресурсов процессора;
  • на сэкономленное место можно внедрить рекламу (если это небольшой нативный плагин, к примеру Unity ADS для Defold) или еще что-то необходимое.

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