Ottimizzare una compilazione per dimensioni

Razionale

Sometimes, it is desired to optimize a build for size rather than speed. This means not compiling unused functions from the engine, as well as using specific compiler flags to aid on decreasing build size. Common situations include creating builds for mobile and Web platforms.

Questo tutorial si propone di fornire una panoramica sui diversi metodi per creare un eseguibile più piccolo. Prima di continuare, si consiglia di leggere i tutorial precedenti sulla compilazione di Godot per ciascuna piattaforma.

Le opzioni sottostanti sono elencate dalla più importante (maggiore risparmio sulle dimensioni) alla meno importante (minore risparmio sulle dimensioni).

Stripping binaries

  • Risparmio di spazio: Molto alto

  • Difficoltà: Facile

  • Effettuato in compilazioni ufficiali:

Se si compilano eseguibili per Windows (MinGW), Linux o macOS da sorgente, non dimenticare di rimuovere i simboli di debug dagli eseguibili installando il pacchetto strip dalla propria distribuzione, quindi eseguendo:

strip path/to/godot.binary

Su Windows, strip.exe è incluso nella maggior parte delle configurazioni della toolchain MinGW.

Questo ridurrà le dimensioni degli eseguibili compilati di un fattore compreso tra 5 e 10. Lo svantaggio è che i backtrace dei crash non forniranno più informazioni accurate (le quali sono utili per risolvere problemi riguardo la causa di un crash). I profiler di C++ non saranno nemmeno più in grado di visualizzare i nomi delle funzioni (ciò non influisce sul profiler integrato di GDScript).

Nota

Il comando sopra riportato non funziona sugli eseguibili di Windows compilati con MSVC e piattaforme come Android e Web. In alternativa, passare debug_symbols=no sulla riga di comando di SCons durante la compilazione.

Ottimizzare per dimensione anziché per velocità

  • Risparmio di spazio: Alto

  • Difficoltà: Facile

  • Effettuato in compilazioni ufficiali: Sì, ma solo per le compilazioni web

Da Godot 3.1 in poi, è possibile compilare utilizzando un ottimizzazione di dimensione (anziché di velocità). Per abilitare questa funzionalità, impostare il flag optimize su size:

scons target=template_release optimize=size

Alcune piattaforme, come WebAssembly, utilizzano già questa modalità come predefinito.

Disabilitare il server di testo avanzato

  • Risparmio di spazio: Alto

  • Difficoltà: Facile

  • Effettuato in compilazioni ufficiali: No

Come predefinito, Godot utilizza un server di testo avanzato con supporto per le seguenti funzionalità:

  • 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.

Nota

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.

Disabilitare il 3D

  • Risparmio di spazio: Moderato

  • Difficoltà: Facile

  • Effettuato in compilazioni ufficiali: No

Per i giochi 2D, avere a disposizione l'intero motore 3D di solito non ha senso. Per questa ragione, esiste un flag di compilazione per disabilitarlo:

scons target=template_release disable_3d=yes

Gli strumenti (Tools) si devono disabilitare per utilizzare questo flag, poiché l'editor non è progettato per funzionare senza il supporto 3D. Senza di esso, la dimensione dell'eseguibile si può ridurre di circa il 15%.

Nota

Disabilitando il supporto 3D si disabilita anche tutta la navigazione. Ciò include anche la navigazione 2D, poiché utilizza internamente il sistema di navigazione 3D.

Disabilitare gli oggetti della GUI avanzati

  • Risparmio di spazio: Moderato

  • Difficoltà: Facile

  • Effettuato in compilazioni ufficiali: No

La maggior parte dei piccoli giochi non richiedono controlli complessi per l'interfaccia grafica, tra i quali Tree, ItemList, TextEdit o GraphEdit. Si possono disabilitare utilizzando un flag di compilazione:

scons target=template_release disable_advanced_gui=yes

Questo è tutto ciò che sarà disabilitato:

Disabilitare i moduli indesiderati

  • Risparmio di spazio: Da molto basso a moderato a seconda dei moduli

  • Difficoltà: Da media a difficile a seconda dei moduli

  • Effettuato in compilazioni ufficiali: No

Molte funzioni di Godot sono offerte come moduli. È possibile visualizzare un elenco dei moduli con il seguente comando:

scons --help

Apparirà l'elenco dei moduli che si possono disabilitare, insieme a tutte le opzioni di compilazione. Se si sta lavorando a un semplice gioco in 2D, molti di questi si potrebbero disabilitare:

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, minimp3/ogg/vorbis to play music, or theora to play videos).

In alternativa, è possibile fornire un elenco di moduli disabilitati creando custom.py alla radice del codice sorgente, con un contenuto simile al seguente:

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"

Ottimizzare la distribuzione del proprio progetto

Desktop

Nota

Questa sezione è rilevante solo quando si distribuiscono file su una piattaforma desktop che non effettua una compressione o un impacchettamento da sola. Pertanto, questo consiglio è pertinente quando si distribuiscono archivi ZIP su itch.io o su GitHub Releases.

Piattaforme come Steam applicano già il proprio schema di compressione, quindi non è necessario affatto creare un archivio ZIP per distribuire i file.

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 si può utilizzare per creare archivi ZIP più efficienti del solito, pur rimanendo compatibile con qualsiasi estrattore ZIP (incluso quello integrato di Windows). La riduzione della dimensione di un file ZIP in un grande progetto può raggiungere decine di megabyte rispetto a un tipico compressore ZIP, anche se il risparmio nella media sia tra 1 e 5 MB. La creazione di questo archivio ZIP richiederà più tempo del solito, ma l'estrazione sarà veloce quanto qualsiasi altro archivio ZIP.

Attraverso l'interfaccia utente grafica di 7-Zip, ciò si effettua creando un archivio ZIP con la modalità di compressione Ultra. Attraverso la riga di comando, ciò si effettua con il seguente comando:

7z a -mx9 my_project.zip folder_containing_executable_and_pck

Web

Abilitando la compressione gzip o Brotli per tutti i tipi di file dall'esportazione web (in particolare .wasm e .pck) è possibile ridurre notevolmente le dimensioni del download, con conseguenti tempi di caricamento più rapidi, in particolare su connessioni lente.

Creare file gzip o Brotli precompressi con un alto livello di compressione può essere ancora più efficiente, purché il server web sia configurato per gestire tali file quando esistono. Se supportato, Brotli dovrebbe essere preferito a gzip in quanto ha maggiore potenziale di ridurre le dimensioni dei file.

Consultare Serving the files per istruzioni.