Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Ottimizzare una compilazione per dimensioni

Razionale

A volte, è preferibile ottimizzare una build in base alle dimensioni piuttosto che alla velocità. Ciò significa non compilare funzioni inutilizzate dal motore, nonché utilizzare flag di compilazione specifici per contribuire a ridurre le dimensioni della build. Situazioni comuni includono la creazione di build per piattaforme mobile e web.

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

Rimozione dei file binari

  • 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

È possibile compilare Godot utilizzando un'ottimizzazione di dimensione (anziché di velocità). Per abilitarla, impostare il flag optimize su size:

scons target=template_release optimize=size

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

Godot 4.5 ha introdotto l'opzione size_extra, che può ridurre ulteriormente le dimensioni.

scons target=template_release optimize=size_extra

Rilevare le funzionalità utilizzate dal progetto attuale e disattivare le funzionalità non utilizzate

  • Risparmio di spazio: Da moderato a alto a seconda del progetto

  • Difficoltà: Da facile a media a seconda del progetto

  • Effettuato in compilazioni ufficiali: No

Godot include uno strumento Utilizzare l'editor di configurazione di compilazione del motore in grado di rilevare le funzionalità utilizzate nel progetto attuale e creare un profilo di build. Una volta salvato, questo profilo di build può essere passato a SCons al momento della compilazione dei modelli di esportazione personalizzati:

scons target=template_release build_profile=/path/to/profile.gdbuild

Si noti che per alcuni progetti, il rilevamento delle funzionalità potrebbe essere troppo aggressivo e disabilitare funzionalità effettivamente necessarie in fase di esecuzione. Ciò può accadere se alcune funzionalità sono utilizzate in modo tale che il loro utilizzo non si possa rilevare staticamente (ad esempio, uno script creato proceduralmente ed eseguito in fase di esecuzione).

È possibile disattivare funzionalità più specifiche seguendo le sezioni seguenti, ma è bene ricordare che molte di esse sono rilevate automaticamente dal rilevatore di configurazione della compilazione del motore.

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

Ricordare di passare sempre module_text_server_fb_enabled=yes quando si usa module_text_server_adv_enabled=no. Altrimenti, il binario compilato non conterrà alcun server di testo, il che significa che non verrà visualizzato alcun testo quando il progetto viene eseguito.

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

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 motori di fisica

  • Risparmio di spazio: Basso a moderato

  • Difficoltà: Facile

  • Effettuato in compilazioni ufficiali: No

Se il proprio progetto 3D utilizza Jolt Physics, è possibile disabilitare GodotPhysics3D in fase di compilazione, poiché non sarà mai utilizzato:

scons target=template_release module_godot_physics_3d_enabled=no

Al contrario, se il proprio progetto 3D utilizza GodotPhysics3D, è possibile disabilitare Jolt Physics in fase di compilazione:

scons target=template_release module_jolt_enabled=no

Se il proprio progetto utilizza il rendering 3D ma non la sua fisica (o il rendering 2D ma non la sua fisica), è possibile anche disabilitare completamente la fisica 2D o 3D. La maggior parte dei progetti 3D può trarne vantaggio, poiché non utilizzano la fisica 2D:

scons target=template_release disable_physics_2d=yes
scons target=template_release disable_physics_3d=yes

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

Se questa soluzione non dovesse funzionare per il proprio caso d'uso, si consiglia di rivedere l'elenco dei moduli e vedere quali servono ancora per il proprio gioco (ad esempio, si potrebbe voler mantenere i moduli relativi alla rete, il supporto per le espressioni regolari, mp3/ogg/vorbis per riprodurre musica o theora per riprodurre video).

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

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 Distribuire i file per istruzioni.