Einen Build auf Größe optimieren

Hintergrund

Manchmal ist es wünschenswert, einen Build eher auf Größe als auf Geschwindigkeit zu optimieren. Dies bedeutet, dass ungenutzte Funktionen der Engine nicht kompiliert werden und dass bestimmte Compiler-Flags verwendet werden, um die Größe des Builds zu verringern. Häufige Situationen sind die Erstellung von Builds für Mobile und Web-Plattformen.

Dieses Tutorial soll einen Überblick über die verschiedenen Methoden zur Erstellung einer kleineren Binärdatei geben. Bevor Sie fortfahren, sollten Sie die vorherigen Tutorials zur Kompilierung von Godot für jede Plattform lesen.

Die nachstehenden Optionen sind in der Reihenfolge ihrer Wichtigkeit (größte Einsparungen) und ihrer Unwichtigkeit (geringste Einsparungen) aufgeführt.

Binärdateien bereinigen

  • Platzersparnis: Sehr hoch

  • Schwierigkeit: Einfach

  • Durchgeführt in offiziellen Builds: Ja

Wenn Sie Windows- (MinGW), Linux- oder macOS-Binärdateien aus dem Quellcode erstellen, denken Sie daran, Debug-Symbole aus den Binärdateien zu entfernen, indem Sie das Paket strip aus Ihrer Distribution installieren und dann ausführen:

strip path/to/godot.binary

Unter Windows ist strip.exe in den meisten MinGW Toolchain-Setups enthalten.

Dadurch wird die Größe der kompilierten Binärdateien um einen Faktor zwischen 5x und 10x reduziert. Der Nachteil ist, dass Crash-Backtraces keine genauen Informationen mehr liefern (was für die Fehlersuche bei der Ursache eines Absturzes nützlich ist). C++-Profiler werden auch nicht mehr in der Lage sein, Funktionsnamen anzuzeigen (dies betrifft nicht den Built-in-GDScript-Profiler).

Bemerkung

Der obige Befehl funktioniert nicht bei Windows-Binärdateien, die mit MSVC kompiliert wurden, und bei Plattformen wie Android und Web. Übergeben Sie stattdessen debug_symbols=no in der SCons-Kommandozeile beim Kompilieren.

Optimieren auf Größe statt Geschwindigkeit

  • Platzersparnis: Hoch

  • Schwierigkeit: Einfach

  • Durchgeführt in offiziellen Builds: Ja, aber nur für Web-Builds

Ab Godot 3.1 ist es möglich, die Kompilierung unter Verwendung von Größenoptimierungen (anstelle von Geschwindigkeitsoptimierungen) durchzuführen. Um dies zu aktivieren, setzen Sie das Flag optimize auf size:

scons target=template_release optimize=size

Einige Plattformen wie z.B. WebAssembly verwenden diesen Modus bereits standardmäßig.

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

  • Durchgeführt in offiziellen Builds: Nein

Godot features an Using the engine compilation configuration editor 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.

Deaktivieren des erweiterten Text-Servers

  • Platzersparnis: Hoch

  • Schwierigkeit: Einfach

  • Durchgeführt in offiziellen Builds: Nein

Godot verwendet standardmäßig einen erweiterten Textserver mit Unterstützung für die folgenden Features:

  • Rechts-nach-links-Schriftsatz und komplexe Schriftzeichen, die für Sprachen wie Arabisch und Hebräisch erforderlich sind.

  • Ligaturen und OpenType-Merkmale (wie Kapitälchen, Bruchzahlen und durchgestrichene Nullen).

Godot bietet einen Fallback-Text-Server, der standardmäßig nicht kompiliert ist. Dieser Textserver kann als leichtgewichtige Alternative zum standardmäßig verwendeten erweiterten Textserver genutzt werden:

scons target=template_release module_text_server_adv_enabled=no module_text_server_fb_enabled=yes

Wenn Sie in Ihrem Projekt nur lateinische, griechische und kyrillische Sprachen unterstützen wollen, sollte der Fallback-Text-Server ausreichen.

Dieser Fallback-Text-Server kann auch große Mengen an Text schneller verarbeiten als der erweiterte Textserver. Dadurch eignet sich der Fallback-Textserver gut für Mobile-/Webprojekte.

Bemerkung

Denken Sie daran, immer module_text_server_fb_enabled=yes zu übergeben, wenn Sie module_text_server_adv_enabled=no verwenden. Andernfalls wird die kompilierte Binärdatei keinen Textserver enthalten, was bedeutet, dass überhaupt kein Text angezeigt wird, wenn das Projekt läuft.

3D abschalten

  • Platzersparnis: Mäßig

  • Schwierigkeit: Einfach

  • Durchgeführt in offiziellen Builds: Nein

Bei 2D-Spielen macht es normalerweise keinen Sinn, die gesamte 3D-Engine zur Verfügung zu haben. Aus diesem Grund gibt es ein Build-Flag, um dies zu deaktivieren:

scons target=template_release disable_3d=yes

Die Tools müssen deaktiviert werden, um dieses Flag zu verwenden, da der Editor nicht für den Betrieb ohne 3D-Unterstützung ausgelegt ist. Ohne dieses Flag kann die Binärgröße um etwa 15 % reduziert werden.

Deaktivieren erweiterter GUI-Objekte

  • Platzersparnis: Mäßig

  • Schwierigkeit: Einfach

  • Durchgeführt in offiziellen Builds: Nein

Die meisten kleinen Spiele benötigen keine komplexen GUI Kontroll-Elemente wie Tree, ItemList, TextEdit or GraphEdit. Sie können abgeschaltet werden mit einem Build Flag:

scons target=template_release disable_advanced_gui=yes

Dies ist alles, was deaktiviert werden wird:

Disabling physics engines

  • Space savings: Low to moderate

  • Schwierigkeit: Einfach

  • Durchgeführt in offiziellen Builds: Nein

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

Unerwünschte Module deaktivieren

  • Platzersparnis: Sehr gering bis mäßig je nach Modulen

  • Schwierigkeit: Mittel bis schwer, je nach Modulen

  • Durchgeführt in offiziellen Builds: Nein

Viele der Funktionen von Godot werden als Module angeboten. Sie können eine Liste der Module mit dem folgenden Befehl anzeigen:

scons --help

Die Liste der Module, die deaktiviert werden können, wird zusammen mit allen Build-Optionen angezeigt. Wenn Sie an einem einfachen 2D-Spiel arbeiten, können Sie viele von ihnen deaktivieren:

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_minimp3_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

Wenn sich dies für Ihren Anwendungsfall als nicht praktikabel erweist, sollten Sie die Liste der Module überprüfen und sehen, welche Sie tatsächlich noch für Ihr Spiel benötigen (z.B. möchten Sie vielleicht netzwerkbezogene Module, Regex-Unterstützung, minimp3/ogg/vorbis zum Abspielen von Musik oder theora zum Abspielen von Videos behalten wollen).

Alternativ können Sie eine Liste von deaktivierten Modulen bereitstellen, indem Sie custom.py im Stammverzeichnis des Quelltextes erstellen, mit einem Inhalt ähnlich wie folgt:

custom.py
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_minimp3_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"

Optimierung der Erstellung Ihres Projekts

Desktop

Bemerkung

Dieser Abschnitt ist nur relevant, wenn Sie die Dateien für eine Desktop-Plattform veröffentlichen, die keine eigene Komprimierung oder kein eigenes Packen vornimmt. Daher ist dieser Ratschlag relevant, wenn Sie ZIP-Archive auf itch.io oder GitHub-Releases veröffentlichen.

Plattformen wie Steam wenden bereits ihr eigenes Komprimierungsverfahren an, so dass Sie nicht erst ein ZIP-Archiv erstellen müssen, um Dateien zu veröffentlichen.

Nebenbei bemerkt können Sie auch das Erstellen Ihres Projekts selbst optimieren. Dies kann auch ohne Neukompilierung der Exportvorlage erfolgen.

7-Zip kann verwendet werden, um ZIP-Archive zu erstellen, die effizienter als üblich sind, während sie mit jedem ZIP-Extraktor (einschließlich des in Windows integrierten Extraktors) kompatibel bleiben. Die Reduzierung der ZIP-Größe in einem großen Projekt kann Dutzende von Megabytes im Vergleich zu einem typischen ZIP-Kompressor erreichen, obwohl die durchschnittlichen Einsparungen im Bereich von 1-5 MB liegen. Die Erstellung dieses ZIP-Archivs dauert länger als üblich, aber es wird genauso schnell entpackt wie jedes andere ZIP-Archiv.

Bei Verwendung der 7-Zip-Benutzeroberfläche erfolgt dies durch Erstellen eines ZIP-Archivs mit dem Komprimierungsmodus Ultra. Bei der Verwendung der Kommandozeile geschieht dies mit dem folgenden Befehl:

7z a -mx9 my_project.zip folder_containing_executable_and_pck

Web

Wenn Sie die gzip- oder Brotli-Komprimierung für alle Dateitypen aus dem Webexport (insbesondere für .wasm und .pck) aktivieren, kann die Downloadgröße erheblich reduziert werden, was zu schnelleren Ladezeiten führt, insbesondere bei langsamen Verbindungen.

Die Erstellung vorkomprimierter gzip- oder Brotli-Dateien mit einem hohen Komprimierungsgrad kann noch effizienter sein, sofern der Webserver so konfiguriert ist, dass er diese Dateien bereitstellt, wenn sie vorhanden sind. Wenn unterstützt, sollte Brotli gegenüber gzip bevorzugt werden, da es ein größeres Potenzial zur Reduzierung der Dateigröße bietet.

Siehe Dateien bereitstellen für weitere Informationen.