Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Optimiser une compilation pour sa taille
Justification
Parfois, il est souhaitable d'optimiser une compilation en fonction de sa taille plutôt que de sa vitesse. Cela implique de ne pas compiler les fonctions inutilisées du moteur, ainsi que d'utiliser des drapeaux de compilation spécifiques pour aider à réduire la taille de la compilation. Les situations habituelles inclue la création de compilations pour les plateformes mobiles et Web.
Ce tutoriel vise à donner un aperçu des différentes méthodes pour créer un binaire plus petit. Avant de continuer, il est recommandé de lire les tutoriels précédents sur la compilation de Godot pour chaque plateforme.
Les options ci-dessous sont classées de la plus importante (économies de taille les plus importantes) à la moins importante (économies de taille les plus faibles).
Nettoyage des binaires
Gain d'espace : Très haute
Difficulté : Facile
Exécuté dans les builds officiels : Oui
Si vous construisez des binaires Windows (MinGW), Linux ou macOS à partir des sources, n'oubliez pas de retirer les symboles de débogage des binaires en installant le paquet strip de votre distribution puis en l'exécutant :
strip path/to/godot.binary
Sous Windows, strip.exe est inclus dans la plupart des configurations d'outils MinGW.
Cela permettra de réduire la taille des binaires compilés d'un facteur compris entre 5× et 10×. L'inconvénient est que les backtraces de crash ne fourniront plus d'informations précises (ce qui est utile pour dépanner la cause d'un crash). Les profileurs C++ ne pourront également plus afficher les noms de fonctions (cela n'affecte pas le profileur GDScript intégré).
Note
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.
Compilation avec optimisation du temps de liaison
Economie d'espace : Haut
Difficulté : Facile
Exécuté dans les builds officiels : Oui
L'activation de l'optimisation du temps de liaison (linking) produit des fichiers binaires plus efficaces, à la fois en termes de performances et de taille de fichier. Il fonctionne en éliminant les fonctions de modèle (templates) en double et le code inutilisé. Il peut actuellement être utilisé avec les compilateurs GCC et MSVC :
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. You need to have at least 8 GB of RAM available for successful linking with LTO enabled. Since the operating system and programs will take up some RAM, in practice, you need 12 GB of RAM installed in your system (preferably 16 GB) to compile Godot with LTO enabled.
Optimiser pour la taille plutôt que pour la vitesse
Economie d'espace : Haut
Difficulté : Facile
Performed in official builds: Yes, but only for web builds
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
Certaines plateformes telles que WebAssembly utilisent déjà ce mode par défaut.
Godot 4.5 introduced the size_extra option, which can further reduce size.
scons target=template_release optimize=size_extra
Detecting used features from the current project and disabling unused features
Space savings: Moderate to high depending on project
Difficulty: Easy to medium depending on project
Exécuter dans les builds officiels : Non
Godot features an Utiliser l'éditeur de configuration de compilation du moteur tool that can detect the features used in the current project and create a build profile. Once saved, this build profile can then be passed to SCons when compiling custom export templates:
scons target=template_release build_profile=/path/to/profile.gdbuild
Note that for certain projects, the feature detection may be too aggressive and disable features that are actually needed at runtime. This can occur if certain features are used in a way that their usage cannot be detected statically (such as a script being procedurally created and run at runtime).
More specific features can be disabled by following the sections below, but remember that many of them are automatically detected by the engine compilation configuration detector.
Disabling advanced text server
Economie d'espace : Haut
Difficulté : Facile
Exécuter dans les builds officiels : Non
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.
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.
Désactiver la 3D
Economie d'espace : Modérée
Difficulté : Facile
Exécuter dans les builds officiels : Non
Pour les jeux en 2D, le fait de disposer de tout le moteur 3D n'a généralement aucun sens. Pour cette raison, il existe un drapeau de compilation qui permet de le désactiver :
scons target=template_release disable_3d=yes
Les outils (Tools) doivent être désactivés pour utiliser ce drapeau, car l'éditeur n'est pas conçu pour fonctionner sans prise en charge de la 3D. Sans lui, la taille du binaire peut être réduite d'environ 15%.
Désactiver les objets GUI avancés
Economie d'espace : Modérée
Difficulté : Facile
Exécuter dans les builds officiels : Non
La plupart des petits jeux ne nécessitent pas de contrôles complexes de l'interface graphique (GUI) tels que Tree, ItemList, TextEditor ou GraphEdit. Ils peuvent être désactivés à l'aide d'un drapeau de compilation :
scons target=template_release disable_advanced_gui=yes
C'est tout ce qui sera désactivé :
Disabling physics engines
Space savings: Low to moderate
Difficulté : Facile
Exécuter dans les builds officiels : Non
If your 3D project uses Jolt Physics, you can disable GodotPhysics3D at compile-time as it will never be used:
scons target=template_release module_godot_physics_3d_enabled=no
Inversely, if your 3D project uses GodotPhysics3D, you can disable Jolt Physics at compile-time:
scons target=template_release module_jolt_enabled=no
If your project uses 3D rendering but not physics (or 2D rendering but not physics), you can also disable 2D or 3D physics entirely. Most 3D projects can take advantage of this, as they don't make use of 2D physics:
scons target=template_release disable_physics_2d=yes
scons target=template_release disable_physics_3d=yes
Désactiver les modules non désirés
Économie d'espace : Très faible à modérée selon les modules
Difficulté : De moyen à difficile si vous utilisez les modules
Exécuter dans les builds officiels : Non
De nombreuses fonctions de Godot sont proposées sous forme de modules. Vous pouvez voir une liste des modules avec la commande suivante :
scons --help
La liste des modules pouvant être désactivés apparaît, ainsi que toutes les options de compilation. Si vous travaillez sur un jeu 2D simple, vous pouvez en désactiver beaucoup :
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).
Vous pouvez également fournir une liste des modules désactivés en créant custom.py à la racine de la source, avec un contenu similaire à celui qui suit :
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"
Voir aussi
Optimizing the distribution of your project
Bureau
Note
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.
Voir Distribuer les fichiers pour plus d'informations.