Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
Оптимизация размера билда¶
Rationale¶
Иногда хочется оптимизировать сборку не столько для скорости, сколько для размера. Это означает отказ от компиляции неиспользуемых функций из движка, а также использование специальных флагов компилятора для уменьшения размера сборки. К таким ситуациям относится создание сборок для мобильных и веб-платформ.
Цель этого руководства - дать обзор различных методов создания двоичных файлов меньшего размера. Прежде чем продолжить, рекомендуется прочитать предыдущие руководства по компиляции Godot для каждой платформы.
Ниже перечислены варианты от наиболее помогающих (наибольшая экономия размера) до наименее помогающих (наименьшая экономия размера).
Удаление двоичных файлов¶
Экономия места: Очень высокая
Сложность: Низкая
Применяется в официальных сборках: Да
Если вы собираете двоичные файлы 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 при компиляции.
Компиляция с оптимизацией времени соединения¶
** Экономия места:** высокая
Сложность: Низкая
Применяется в официальных сборках: Да
Включение оптимизации времени соединения приводит к созданию более эффективных двоичных файлов, как с точки зрения производительности, так и с точки зрения размера файла. Она работает за счет устранения дублирования шаблонных функций и неиспользуемого кода. В настоящее время ее можно использовать в компиляторах GCC и MSVC:
scons target=template_release lto=full
При использовании этой опции соединение становится медленнее и требует больше оперативной памяти, поэтому ее следует использовать только для релизных сборок:
При компиляции ветки
master
для успешной компоновки с включенным LTO необходимо иметь не менее 8 ГБ оперативной памяти.При компиляции ветки
3.x
для успешной компоновки с включенным LTO необходимо иметь не менее 6 ГБ оперативной памяти.
Оптимизация по размеру, а не по скорости¶
** Экономия места:** высокая
Сложность: Низкая
Применяется в официальных сборках: Да, но только для веб-сборок
Godot, новее 3.1 позволяет компилировать с использованием оптимизаций по размеру (вместо скорости). Чтобы включить эту возможность, установите флаг optimize
в значение size
:
scons target=template_release optimize=size
Некоторые платформы, такие как WebAssembly, уже используют этот режим по умолчанию.
Отключение расширенного текстового сервера¶
** Экономия места:** высокая
Сложность: Низкая
Применяется в официальных сборках: Нет
By default, Godot uses an advanced text server with the support for the following features:
Right-to-left typesetting and complex scripts, required to write languages such as Arabic and Hebrew.
Font ligatures and OpenType features (such as small capitals, fractions and slashed zero).
Godot provides a fallback text server that isn't compiled by default. This text server can be used as a lightweight alternative to the default advanced text server:
scons target=template_release module_text_server_adv_enabled=no module_text_server_fb_enabled=yes
If you only intend on supporting Latin, Greek and Cyrillic-based languages in your project, the fallback text server should suffice.
This fallback text server can also process large amounts of text more quickly than the advanced text server. This makes the fallback text server a good fit for mobile/web projects.
Примечание
Remember to always pass module_text_server_fb_enabled=yes
when using
module_text_server_adv_enabled=no
. Otherwise, the compiled binary won't
contain any text server, which means no text will be displayed at all when
running the project.
Disabling 3D¶
Space savings: Moderate
Сложность: Низкая
Применяется в официальных сборках: Нет
For 2D games, having the whole 3D engine available usually makes no sense. Because of this, there is a build flag to disable it:
scons target=template_release disable_3d=yes
Tools must be disabled in order to use this flag, as the editor is not designed to operate without 3D support. Without it, the binary size can be reduced by about 15%.
Disabling advanced GUI objects¶
Space savings: Moderate
Сложность: Низкая
Применяется в официальных сборках: Нет
Most small games don't require complex GUI controls such as Tree, ItemList, TextEdit or GraphEdit. They can be disabled using a build flag:
scons target=template_release disable_advanced_gui=yes
This is everything that will be disabled:
FileDialog
PopupMenu
Tree
TextEdit
CodeEdit
SyntaxHighlighter
CodeHighlighter
TreeItem
OptionButton
SpinBox
ColorPicker
ColorPickerButton
RichTextlabel
RichTextEffect
CharFXTransform
AcceptDialog
ConfirmationDialog
MarginContainer
SubViewportContainer
SplitContainer
HSplitContainer
VSplitContainer
GraphNode
GraphEdit
Disabling unwanted modules¶
Space savings: Very low to moderate depending on modules
Difficulty: Medium to hard depending on modules
Применяется в официальных сборках: Нет
A lot of Godot's functions are offered as modules. You can see a list of modules with the following command:
scons --help
The list of modules that can be disabled will appear, together with all build options. If you are working on a simple 2D game, you could disable a lot of them:
scons target=template_release module_basis_universal_enabled=no module_bmp_enabled=no module_camera_enabled=no module_csg_enabled=no module_dds_enabled=no module_enet_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_jsonrpc_enabled=no module_ktx_enabled=no module_mbedtls_enabled=no module_meshoptimizer_enabled=no module_minimp3_enabled=no module_mobile_vr_enabled=no module_msdfgen_enabled=no module_multiplayer_enabled=no module_noise_enabled=no module_navigation_enabled=no module_ogg_enabled=no module_openxr_enabled=no module_raycast_enabled=no module_regex_enabled=no module_squish_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,
minimp3
/ogg
/vorbis
to play music, or theora
to play videos).
Alternatively, you can supply a list of disabled modules by creating
custom.py
at the root of the source, with the contents similar to the
following:
# custom.py
module_basis_universal_enabled = "no"
module_bmp_enabled = "no"
module_camera_enabled = "no"
module_csg_enabled = "no"
module_dds_enabled = "no"
module_enet_enabled = "no"
module_gridmap_enabled = "no"
module_hdr_enabled = "no"
module_jsonrpc_enabled = "no"
module_ktx_enabled = "no"
module_mbedtls_enabled = "no"
module_meshoptimizer_enabled = "no"
module_minimp3_enabled = "no"
module_mobile_vr_enabled = "no"
module_msdfgen_enabled= "no"
module_multiplayer_enabled = "no"
module_noise_enabled = "no"
module_navigation_enabled = "no"
module_ogg_enabled = "no"
module_openxr_enabled = "no"
module_raycast_enabled = "no"
module_regex_enabled = "no"
module_squish_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"
См.также
Optimizing the distribution of your project¶
Desktop¶
Примечание
This section is only relevant when distributing the files on a desktop platform that doesn't perform its own compression or packing. As such, this advice is relevant when you distribute ZIP archives on itch.io or GitHub Releases.
Platforms like Steam already apply their own compression scheme, so you don't need to create a ZIP archive to distribute files in the first place.
As an aside, you can look into optimizing the distribution of your project itself. This can be done even without recompiling the export template.
7-Zip can be used to create ZIP archives that are more efficient than usual, while remaining compatible with every ZIP extractor (including Windows' own built-in extractor). ZIP size reduction in a large project can reach dozens of megabytes compared to a typical ZIP compressor, although average savings are in the 1-5 MB range. Creating this ZIP archive will take longer than usual, but it will extract just as fast as any other ZIP archive.
When using the 7-Zip GUI, this is done by creating a ZIP archive with the Ultra compression mode. When using the command line, this is done using the following command:
7z a -mx9 my_project.zip folder_containing_executable_and_pck
Web¶
Enabling gzip or Brotli compression for all file types from the web export
(especially the .wasm
and .pck
) can reduce the download size
significantly, leading to faster loading times, especially on slow connections.
Creating precompressed gzip or Brotli files with a high compression level can be even more efficient, as long as the web server is configured to serve those files when they exist. When supported, Brotli should be preferred over gzip as it has a greater potential for file size reduction.
See Обслуживание файлов for instructions.