Defold. Уменьшаем размер билда. App Manifest.
Last updated: 2021, Jan 02
Я часто рассказываю о том, как же клево, что у Defold очень маленький размер билда, но давайте рассмотрим, какие именно инструменты позволяют этого добиться.
Есть две основных фичи движка, которые позволяют делать очень маленькие билды:
- для бинарника — это модульность, которая достигается с помощью использования App Manifest;
- для контента — это сжатие текстур, в частности WebP, который позволяет уменьшить размер текстур без потери качества.
В этот раз будем разбираться с модульностью.
Defold App Manifest
App Manifest — это конфиг файл, описывающий, какие именно библиотеки вы хотите использовать, а какие вы бы хотели исключить из билда. При сборке приложения этот файл отправляется на билд-сервер. На его основе вам высылают бинарник движка с нужным содержимым под необходимые платформы.
Работать с конфигом очень просто:
- Создаем файл some_name.appmanifest в папке проекта.
- Копируем в него нужную конфигурацию (где ее взять описано ниже).
- указываем путь к файлу в game.project в разделе native_extension в поле App Manifest.
На данный момент опция App Manifest в документации помечена как «alpha state«, но я (и не только я) использую ее во всех своих играх и всё работает прекрасно. Пометка эта добавлена скорее из-за того, что все настройки приходится вносить руками, прописывать платформы и самому вспоминать, что использовал у себя в проекте, а что нет. В будущем обещают упростить этот процесс и сделать так, чтобы движок сам решал, какие модули вам нужны на основании того, что вы используете, но это не приоритетная задача по двум причинам: во-первых, чаще всего конфиг делается один раз и больше об этом не вспоминаешь, во-вторых, есть утилита, которая в этом помогает:
- https://britzl.github.io/manifestation/ — онлайн конструктор, где можно просто проставить галочки напротив нужных вам функций и получить готовый app manifest.
Какие опции сейчас доступны (опишу опции из онлайн генератора, рассмотреть, какие библиотеки и за это отвечают можно там же):
- Exclude Physics 2D — удаление Box2D физики;
- Exclude Physics 3D — эта опция отключает Bullet Physics Library;
- Exclude Record — удаление встроенной функции записи видео;
- Exclude Profiler — удаление встроенного профайлера;
- Exclude Facebook — удаление Facebook SDK;
- Exclude Gameroom — удаление Facebook Gameroom;
- Exclude Sound — удаление звуковой системы;
- Exclude Input — удаление системы пользовательского ввода;
Пример.
Пример использования на одной из моих игр с таким вот конфигом (кликните, чтобы посмотреть):
# App manifest generated Thu May 16 2019 18:37:47 GMT+0200 (CEST)
# Settings: Physics2D,Physics3D,Record,Profiler,Facebook,Gameroom
platforms:
x86_64-osx:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
x86_64-linux:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
js-web:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeJsLibs: ["facebook"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
wasm-web:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeJsLibs: ["facebook"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
x86-win32:
context:
excludeLibs: ["libphysics","libLinearMath","libBulletDynamics","libBulletCollision","libBox2D","librecord","vpx","libprofilerext","libfacebookext.lib","gameroomext"]
excludeSymbols: ["ProfilerExt","FacebookExt","GameroomExt"]
libs: ["libphysics_null.lib","librecord_null.lib","libprofilerext_null.lib"]
linkFlags: []
x86_64-win32:
context:
excludeLibs: ["libphysics","libLinearMath","libBulletDynamics","libBulletCollision","libBox2D","librecord","vpx","libprofilerext","libfacebookext.lib","gameroomext"]
excludeSymbols: ["ProfilerExt","FacebookExt","GameroomExt"]
libs: ["libphysics_null.lib","librecord_null.lib","libprofilerext_null.lib"]
linkFlags: []
armv7-android:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeJars: ["(.*)/facebooksdk.jar","(.*)/facebook_android.jar"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
arm64-android:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeJars: ["(.*)/facebooksdk.jar","(.*)/facebook_android.jar"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
armv7-ios:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
arm64-ios:
context:
excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision","Box2D","record","vpx","profilerext","facebookext"]
excludeSymbols: ["ProfilerExt","FacebookExt"]
libs: ["physics_null","record_null","profilerext_null"]
linkFlags: []
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) или еще что-то необходимое.
Я хотел рассмотреть сжатие текстур в этой же статье, но уже в процессе написания понял, что и без этого текста вышло много. Продолжение будет скоро. Я надеюсь =) Буду рад любым вопросам и комментариям.