Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

ビルドのサイズを最適化する

理由

時として、速度よりもサイズを重視して最適化したいこともあります。それには、エンジンの不必要な機能をコンパイルしないようにしたり、サイズ縮小に役立つ特定のコンパイラ フラグを用いることです。主に、モバイルやWebプラットフォーム向けのビルドをする場合が想定されます。

このチュートリアルでは、より小さなバイナリを作るための複数の方法を紹介していきます。先にすすむ前にまず、Godotをそれぞれのプラットフォームにコンパイルすることについてのチュートリアルを読むことをおすすめします。

The options below are listed from the most important (greatest size savings) to the least important (lowest size savings).

バイナリの除去

  • Space savings: Very high

  • Difficulty: Easy

  • Performed in official builds: Yes

If you build Windows (MinGW), Linux or macOS binaries from source, remember to strip debug symbols from binaries by installing the strip package from your distribution then running:

strip path/to/godot.binary

On Windows, strip.exe is included in most MinGW toolchain setups.

This will reduce the size of compiled binaries by a factor between 5× and 10×. The downside is that crash backtraces will no longer provide accurate information (which is useful for troubleshooting the cause of a crash). C++ profilers will also no longer be able to display function names (this does not affect the built-in GDScript profiler).

注釈

The above command will not work on Windows binaries compiled with MSVC and platforms such as Android and Web. Instead, pass debug_symbols=no on the SCons command line when compiling.

スピードの代わりにサイズを最適化する

  • Space savings: High

  • Difficulty: Easy

  • Performed in official builds: Yes, but only for web builds

Godot 3.1 onwards allows compiling using size optimizations (instead of speed). To enable this, set the optimize flag to size:

scons target=template_release optimize=size

WebAssemblyのようないくつかのプラットフォームでは、標準でこのモードが有効になっています。

Disabling advanced text server

  • Space savings: High

  • Difficulty: Easy

  • Performed in official builds: No

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.

3Dの無効化

  • Space savings: Moderate

  • Difficulty: Easy

  • Performed in official builds: No

2Dゲームに3Dエンジン全体を持たせることは、通常あまり意味はありません。そのため、これを無効化するビルド フラグがあります:

scons target=template_release disable_3d=yes

エディタは3Dサポート無しで動くようには設計されていないため、このフラグを使うには、まず tools を無効にする必要があります。3Dの無効化により、バイナリのサイズはおよそ15%減ります。

Disabling advanced GUI objects

  • Space savings: Moderate

  • Difficulty: Easy

  • Performed in official builds: No

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

不要なモジュールの無効化

  • Space savings: Very low to moderate depending on modules

  • Difficulty: Medium to hard depending on modules

  • Performed in official builds: No

Godotの機能の多くはモジュールとして提供されています。モジュールのリストを見るには、次のコマンドを使います:

scons --help

無効にできるモジュールのリストが、ビルドオプションと共に表示されます。シンプルな2Dゲームであれば、このうちの多くを無効にできます:

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"

参考

:ref:'doc_overriding_build_options'。

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.