Оптимизация размера билда

Обоснование

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

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

Ниже перечислены варианты от наиболее помогающих (наибольшая экономия размера) до наименее помогающих (наименьшая экономия размера).

Удаление двоичных файлов

  • Space savings (Экономия места): Очень высокая

  • Difficulty (Сложность): Низкая

  • Performed in official builds (Применяется в официальных сборках): Да

Если вы собираете двоичные файлы Windows (MinGW), Linux или macOS , не забудьте удалить отладочные символы из двоичных файлов, установив пакет strip из вашего дистрибутива и запустив:

strip path/to/godot.binary

В Windows strip.exe входит в состав большинства наборов инструментов MinGW.

Это позволит уменьшить размер компилируемых двоичных файлов в 5-10 раз. Недостатком является то, что обратная отладка больше не будет предоставлять точную информацию (что полезно для поиска причин ошибки). C++ profilers также больше не смогут отображать имена функций (это не влияет на встроенный профилировщик GDScript).

Примечание

Приведенная выше команда не будет работать с двоичными файлами для Windows, скомпилированных с помощью MSVC, и таких платформ, как Android и Web. Вместо этого передайте debug_symbols=no в командной строке SCons при компиляции.

Оптимизация по размеру, а не по скорости

  • ** Экономия места:** высокая

  • Difficulty (Сложность): Низкая

  • Применяется в официальных сборках: Да, но только для веб-сборок

It is possible to compile Godot using size optimizations (instead of speed). To enable this, set the optimize flag to size:

scons target=template_release optimize=size

Некоторые платформы, такие как WebAssembly, уже используют этот режим по умолчанию.

В Godot 4.5 появилась опция size_extra, которая позволяет еще больше уменьшить размер.

scons target=template_release optimize=size_extra

Обнаружение используемых функций текущего проекта и отключение неиспользуемых функций

  • Экономия места: От умеренной до высокой в зависимости от проекта

  • Difficulty (Сложность): От легкого до среднего в зависимости от проекта

  • Применяется в официальных сборках: Нет

Godot предлагает инструмент Использование редактора конфигурации компиляции движка, который может определить функции, используемые в текущем проекте, и создать профиль сборки. После сохранения этот профиль сборки можно передать в SCons при компиляции пользовательских шаблонов экспорта:

scons target=template_release build_profile=/path/to/profile.gdbuild

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

Более конкретные функции можно отключить, следуя инструкциям ниже, но помните, что многие из них автоматически обнаруживаются детектором конфигурации компиляции движка.

Отключение расширенного текстового сервера

  • ** Экономия места:** высокая

  • Difficulty (Сложность): Низкая

  • Применяется в официальных сборках: Нет

По умолчанию Godot использует продвинутый текстовый сервер с поддержкой следующих функций:

  • Набор текста справа-налево и сложные шрифты, необходимые для письма на таких языках, как арабский и иврит.

  • Лигатуры шрифтов и функции OpenType (такие как маленькие заглавные буквы, дроби и перечеркнутый ноль).

Godot предоставляет резервный текстовый сервер, который не компилируется по умолчанию. Этот текстовый сервер можно использовать как облегченную альтернативу стандартному расширенному текстовому серверу:

scons target=template_release module_text_server_adv_enabled=no module_text_server_fb_enabled=yes

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

Этот резервный текстовый сервер также может обрабатывать большие объёмы текста быстрее, чем расширенный текстовый сервер. Это делает его отличным выбором для мобильных и веб-проектов.

Примечание

Не забывайте всегда передавать module_text_server_fb_enabled=yes при использовании module_text_server_adv_enabled=no. В противном случае скомпилированный двоичный файл не будет содержать текстового сервера, а значит, при запуске проекта текст вообще не будет отображаться.

Отключение 3D

  • Space savings (Экономия места): Умеренная

  • Difficulty (Сложность): Низкая

  • Применяется в официальных сборках: Нет

Для 2D-игр наличие всего 3D-движка обычно не имеет смысла. Поэтому существует флаг сборки, отключающий его:

scons target=template_release disable_3d=yes

Для использования этого флага необходимо отключить инструменты, так как редактор не предназначен для работы без поддержки 3D. Без неё размер двоичного файла может уменьшиться примерно на 15%.

Отключение расширенных объектов графического интерфейса (GUI)

  • Space savings (Экономия места): Умеренная

  • Difficulty (Сложность): Низкая

  • Применяется в официальных сборках: Нет

Большинству небольших игр не требуются сложные элементы управления графическим интерфейсом, такие как Tree, ItemList, TextEdit или GraphEdit. Их можно отключить с помощью флага сборки:

scons target=template_release disable_advanced_gui=yes

Вот все, что будет отключено:

Отключение физических движков

  • Экономия места: От низкой до умеренной

  • Difficulty (Сложность): Низкая

  • Применяется в официальных сборках: Нет

Если ваш 3D-проект использует Jolt Physics, вы можете отключить GodotPhysics3D во время компиляции, так как он никогда не будет использоваться:

scons target=template_release module_godot_physics_3d_enabled=no

И наоборот, если ваш 3D-проект использует GodotPhysics3D, вы можете отключить Jolt Physics во время компиляции:

scons target=template_release module_jolt_enabled=no

Если ваш проект использует 3D-рендеринг, но не физику (или 2D-рендеринг, но не физику), вы также можете полностью отключить 2D- или 3D-физику. Большинство 3D-проектов могут воспользоваться этим преимуществом, поскольку они не используют 2D-физику:

scons target=template_release disable_physics_2d=yes
scons target=template_release disable_physics_3d=yes

Отключение нежелательных модулей

  • Space savings (Экономия места): От очень низкой до умеренной в зависимости от модулей

  • Difficulty (Сложность): От средней до высокой в зависимости от модулей

  • Применяется в официальных сборках: Нет

Многие функции Godot представлены в виде модулей. Вы можете просмотреть список модулей с помощью следующей команды:

scons --help

Появится список модулей, которые можно отключить, а также все параметры сборки. Если вы работаете над простой 2D-игрой, вы можете отключить многие из них:

scons target=template_release module_astcenc_enabled=no module_basis_universal_enabled=no module_bcdec_enabled=no module_bmp_enabled=no module_camera_enabled=no module_csg_enabled=no module_dds_enabled=no module_enet_enabled=no module_etcpak_enabled=no module_fbx_enabled=no module_gltf_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_interactive_music_enabled=no module_jsonrpc_enabled=no module_ktx_enabled=no module_mbedtls_enabled=no module_meshoptimizer_enabled=no module_mp3_enabled=no module_mobile_vr_enabled=no module_msdfgen_enabled=no module_multiplayer_enabled=no module_noise_enabled=no module_navigation_2d_enabled=no module_navigation_3d_enabled=no module_ogg_enabled=no module_openxr_enabled=no module_raycast_enabled=no module_regex_enabled=no module_svg_enabled=no module_tga_enabled=no module_theora_enabled=no module_tinyexr_enabled=no module_upnp_enabled=no module_vhacd_enabled=no module_vorbis_enabled=no module_webrtc_enabled=no module_websocket_enabled=no module_webxr_enabled=no module_zip_enabled=no

If this proves not to work for your use case, you should review the list of modules and see which ones you actually still need for your game (e.g. you might want to keep networking-related modules, regex support, mp3/ogg/vorbis to play music, or theora to play videos).

В качестве альтернативы вы можете предоставить список отключенных модулей, создав custom.py в корне исходного кода с содержимым, аналогичным следующему:

custom.py
module_astcenc_enabled = "no"
module_basis_universal_enabled = "no"
module_bcdec_enabled = "no"
module_bmp_enabled = "no"
module_camera_enabled = "no"
module_csg_enabled = "no"
module_dds_enabled = "no"
module_enet_enabled = "no"
module_etcpak_enabled = "no"
module_fbx_enabled = "no"
module_gltf_enabled = "no"
module_gridmap_enabled = "no"
module_hdr_enabled = "no"
module_interactive_music_enabled = "no"
module_jsonrpc_enabled = "no"
module_ktx_enabled = "no"
module_mbedtls_enabled = "no"
module_meshoptimizer_enabled = "no"
module_mp3_enabled = "no"
module_mobile_vr_enabled = "no"
module_msdfgen_enabled = "no"
module_multiplayer_enabled = "no"
module_noise_enabled = "no"
module_navigation_2d_enabled = "no"
module_navigation_3d_enabled = "no"
module_ogg_enabled = "no"
module_openxr_enabled = "no"
module_raycast_enabled = "no"
module_regex_enabled = "no"
module_svg_enabled = "no"
module_tga_enabled = "no"
module_theora_enabled = "no"
module_tinyexr_enabled = "no"
module_upnp_enabled = "no"
module_vhacd_enabled = "no"
module_vorbis_enabled = "no"
module_webrtc_enabled = "no"
module_websocket_enabled = "no"
module_webxr_enabled = "no"
module_zip_enabled = "no"

Оптимизация распространения вашего проекта

Настольные

Примечание

Этот раздел актуален только при распространении файлов на десктопной платформе, которая не выполняет сжатие или упаковку самостоятельно. Поэтому этот совет актуален при распространении ZIP-архивов на itch.io или GitHub Releases.

Такие платформы, как Steam, уже применяют собственную схему сжатия, поэтому вам изначально не нужно создавать ZIP-архив для распространения файлов.

Кстати, вы можете рассмотреть возможность оптимизации распространения самого проекта. Это можно сделать даже без перекомпиляции шаблона экспорта.

7-Zip можно использовать для создания ZIP-архивов, которые эффективнее обычных, оставаясь совместимыми со всеми ZIP-архиваторами (включая встроенный в Windows). Сжатие ZIP-архива в больших проектах может достигать десятков мегабайт по сравнению с обычным ZIP-архиватором, хотя средняя экономия составляет от 1 до 5 МБ. Создание этого ZIP-архива займёт больше времени, чем обычно, но распаковка будет такой же быстрой, как и у любого другого ZIP-архива.

При использовании графического интерфейса 7-Zip это делается путём создания ZIP-архива с режимом сжатия Ultra. При использовании командной строки это делается с помощью следующей команды:

7z a -mx9 my_project.zip folder_containing_executable_and_pck

Web

Включение сжатия gzip или Brotli для всех типов файлов при web-экспорте (особенно .wasm и .pck) может значительно уменьшить размер загружаемых файлов, что приведет к ускорению загрузки, особенно при медленных соединениях.

Создание предварительно сжатых файлов gzip или Brotli с высокой степенью сжатия может быть ещё более эффективным, если веб-сервер настроен на обработку этих файлов по мере их появления. Если поддерживается Brotli, его следует предпочесть gzip, поскольку он обладает большим потенциалом для уменьшения размера файлов.

Инструкции см. в документе Обслуживание файлов.