Up to date

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

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.

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:

  • FileDialog

  • PopupMenu

  • Tree

  • TextEdit

  • CodeEdit

  • SyntaxHighlighter

  • CodeHighlighter

  • TreeItem

  • OptionButton

  • SpinBox

  • ColorPicker

  • ColorPickerButton

  • RichTextlabel

  • RichTextEffect

  • CharFXTransform

  • AcceptDialog

  • ConfirmationDialog

  • MarginContainer

  • SubViewportContainer

  • SplitContainer

  • HSplitContainer

  • VSplitContainer

  • GraphNode

  • GraphEdit

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

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_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"

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.