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

La commande ci-dessus ne fonctionnera pas sur les binaires Windows compilés avec MSVC et les plateformes telles que Android et HTML5. Passez plutôt debug_symbols=no sur la ligne de commande SCons lors de la compilation.

Optimiser pour la taille plutôt que pour la vitesse

  • Economie d'espace : Haut

  • Difficulté : Facile

  • Exécuter dans les builds officiels: Oui, mais seulement pour HTML5

Godot 3.1 et suivants permettent de compiler en utilisant des optimisations de taille (au lieu de vitesse). Pour ce faire, il suffit de mettre le drapeau optimize sur size :

scons p=windows target=release tools=no optimize=size

Certaines plateformes telles que WebAssembly utilisent déjà ce mode par défaut.

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 p=windows target=release tools=no 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 p=windows target=release tools=no disable_advanced_gui=yes

C'est tout ce qui sera désactivé :

  • FileDialog

  • PopupMenu

  • Tree

  • TextEdit

  • TreeItem

  • OptionButton

  • SpinBox

  • ColorPicker

  • ColorPickerButton

  • RichTextLabel

  • RichTextEffect

  • CharFXTransform

  • PopupDialog

  • WindowDialog

  • AcceptDialog

  • ConfirmationDialog

  • MarginContainer

  • ViewportContainer

  • SplitContainer

  • HSplitContainer

  • GraphNode

  • GraphEdit

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 p=windows target=release tools=no 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_opus_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_webm_enabled=no module_webrtc_enabled=no module_websocket_enabled=no module_xatlas_unwrap_enabled=no

Si cela ne fonctionne pas dans votre cas, vous devriez revoir la liste des modules et gardez ceux dont vous avez réellement encore besoin pour votre jeu (par exemple, vous pourriez vouloir conserver les modules liés au réseau, au support des expressions régulières (regex), ou à theora/webm pour lire des vidéos).

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 :

# custom.py

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_opus_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_webm_enabled = "no"
module_webrtc_enabled = "no"
module_websocket_enabled = "no"
module_xatlas_unwrap_enabled = "no"