diff --git a/contributing/development/compiling/optimizing_for_size.rst b/contributing/development/compiling/optimizing_for_size.rst index a83d66fde60..a60cf5d5761 100644 --- a/contributing/development/compiling/optimizing_for_size.rst +++ b/contributing/development/compiling/optimizing_for_size.rst @@ -46,48 +46,85 @@ function names (this does not affect the built-in GDScript profiler). .. note:: The above command will not work on Windows binaries compiled with MSVC - and platforms such as Android and HTML5. Instead, pass ``debug_symbols=no`` + and platforms such as Android and Web. Instead, pass ``debug_symbols=no`` on the SCons command line when compiling. +Compiling with link-time optimization +------------------------------------- + +- **Space savings:** High +- **Difficulty:** Easy +- **Performed in official builds:** Yes + +Enabling link-time optimization produces more efficient binaries, both in +terms of performance and file size. It works by eliminating duplicate +template functions and unused code. It can currently be used with the GCC +and MSVC compilers: + +:: + + scons target=template_release lto=full + +Linking becomes much slower and more RAM-consuming with this option, +so it should be used only for release builds: + +- When compiling the ``master`` branch, you need to have at least 8 GB of RAM + available for successful linking with LTO enabled. +- When compiling the ``3.x`` branch, you need to have at least 6 GB of RAM + available for successful linking with LTO enabled. + Optimizing for size instead of speed ------------------------------------ - **Space savings:** High - **Difficulty:** Easy -- **Performed in official builds:** Yes, but only for HTML5 +- **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 p=windows target=template_release optimize=size + scons target=template_release optimize=size Some platforms such as WebAssembly already use this mode by default. -Compiling with link-time optimization -------------------------------------- +Disabling advanced text server +------------------------------ - **Space savings:** High - **Difficulty:** Easy -- **Performed in official builds:** Yes +- **Performed in official builds:** No -Enabling link-time optimization produces more efficient binaries, both in -terms of performance and file size. It works by eliminating duplicate -template functions and unused code. It can currently be used with the GCC -and MSVC compilers: +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 p=windows target=template_release lto=full + scons target=template_release module_text_server_adv_enabled=no module_text_server_fb_enabled=yes -Linking becomes much slower and more RAM-consuming with this option, -so it should be used only for release builds: +If you only intend on supporting Latin, Greek and Cyrillic-based languages in +your project, the fallback text server should suffice. -- When compiling the ``master`` branch, you need to have at least 8 GB of RAM - available for successful linking with LTO enabled. -- When compiling the ``3.x`` branch, you need to have at least 6 GB of RAM - available for successful linking with LTO enabled. +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. + +.. note:: + + 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 ------------ @@ -96,11 +133,12 @@ Disabling 3D - **Difficulty:** Easy - **Performed in official builds:** No -For 2D games, having the whole 3D engine available usually makes no sense. Because of this, there is a build flag to disable it: +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 p=windows target=template_release disable_3d=yes + 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 @@ -118,7 +156,7 @@ TextEdit or GraphEdit. They can be disabled using a build flag: :: - scons p=windows target=template_release disable_advanced_gui=yes + scons target=template_release disable_advanced_gui=yes This is everything that will be disabled: @@ -167,12 +205,12 @@ a lot of them: :: - scons p=windows target=template_release module_arkit_enabled=no module_assimp_enabled=no module_bmp_enabled=no module_bullet_enabled=no module_camera_enabled=no module_csg_enabled=no module_dds_enabled=no module_enet_enabled=no module_etc_enabled=no module_gdnative_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_jsonrpc_enabled=no module_mbedtls_enabled=no module_mobile_vr_enabled=no module_opensimplex_enabled=no module_pvr_enabled=no module_recast_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_xatlas_unwrap_enabled=no + 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, or theora -to play videos). +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 @@ -182,23 +220,27 @@ following: # custom.py - module_arkit_enabled = "no" - module_assimp_enabled = "no" + module_basis_universal_enabled = "no" module_bmp_enabled = "no" - module_bullet_enabled = "no" module_camera_enabled = "no" module_csg_enabled = "no" module_dds_enabled = "no" module_enet_enabled = "no" - module_etc_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_opensimplex_enabled = "no" - module_pvr_enabled = "no" - module_recast_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" @@ -210,7 +252,8 @@ following: module_vorbis_enabled = "no" module_webrtc_enabled = "no" module_websocket_enabled = "no" - module_xatlas_unwrap_enabled = "no" + module_webxr_enabled = "no" + module_zip_enabled = "no" .. seealso::