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: Sì
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.
Compiling with link-time optimization
Risparmio di spazio: Alto
Difficoltà: Facile
Effettuato in compilazioni ufficiali: Sì
Enabling link-time optimization produces more efficient binaries, both in terms of performance and file size. It works by eliminating duplicate template functions and unused code. It can currently be used with the GCC and MSVC compilers:
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:
When compiling the
masterbranch, you need to have at least 8 GB of RAM available for successful linking with LTO enabled.When compiling the
3.xbranch, you need to have at least 6 GB of RAM available for successful linking with LTO enabled.
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:
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"
Vedi anche
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.