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.
Checking the stable version of the documentation...
Ottimizzazione delle prestazioni 3D
Culling
Godot eseguirà automaticamente il view frustum culling per evitare di renderizzare gli oggetti che si trovano fuori dalla viewport. Questo funziona bene per i giochi che si svolgono in aree piccole, ma le cose possono rapidamente diventare problematiche in livelli più grandi.
Occlusion culling
Walking around a town for example, you may only be able to see a few buildings in the street you are in, as well as the sky and a few birds flying overhead. As far as a naive renderer is concerned however, you can still see the entire town. It won't just render the buildings in front of you, it will render the street behind that, with the people on that street, the buildings behind that. You quickly end up in situations where you are attempting to render 10× or 100× more than what is visible.
Le cose non sono poi così male come sembrano, perché lo Z-buffer di solito consente alla GPU di ombreggiare completamente solo gli oggetti in primo piano. Questa tecnica è chiamata depth prepass ed è normalmente abilitata in Godot quando si utilizzano i metodi di rendering Forward+ o Compatibilità. Tuttavia, gli oggetti non necessari continuano a ridurre le prestazioni.
Un modo per ridurre potenzialmente le cose da renderizzare è sfruttare l'occlusione. Godot offrono un nuovo approccio all'occlusion culling attraverso i nodi occlusori. Consulta Occlusion culling per istruzioni su come configurare l'occlusion culling nella tua scena.
Nota
In alcuni casi, potrebbe essere necessario adattare il design dei livelli per aggiungere più opportunità di occlusione. Ad esempio, potrebbe essere necessario aggiungere più muri per impedire al giocatore di vedere troppo lontano, il che ridurrebbe le prestazioni a causa di meno opportunità di occlusione.
Oggetti trasparenti
Godot ordina gli oggetti in base a Material e Shader per migliorare le prestazioni. Tuttavia, questo non è possibile con gli oggetti trasparenti. Gli oggetti trasparenti sono renderizzati da dietro a davanti per farli fondere bene con ciò che si trova dietro. Di conseguenza, cerca di utilizzare il minor numero possibile di oggetti trasparenti. Se un oggetto ha una piccola sezione trasparente, prova a rendere quella sezione una superficie separata con un proprio materiale.
Per ulteriori informazioni, consulta il documento Ottimizzazioni sulla GPU.
Livello di dettaglio (LOD)
In alcune situazioni, soprattutto a distanza, può essere una buona idea sostituire le geometrie complesse con versioni più semplici. L'utente finale probabilmente non noterà molta differenza. Pensa, ad esempio, a un gran numero di alberi in lontananza. Esistono diverse strategie per sostituire i modelli a varie distanze. Si potrebbero utilizzare modelli con un meno poligoni, oppure sfruttare la trasparenza per simulare geometrie più complesse.
Godot 4 offre vari modi per controllare il livello di dettaglio:
Un approccio automatico all'importazione di mesh tramite Mesh level of detail (LOD).
Un approccio manuale configurabile nel nodo 3D tramite Campi di visibilità (HLOD).
Anche le decalcomanie e le luci possono beneficiare del livello di dettaglio tramite le rispettive proprietà Distance Fade.
Sebbene si possano usare separatamente, questi approcci sono più efficaci se usati insieme. Ad esempio, è possibile impostare gli intervalli di visibilità per nascondere gli effetti di particelle troppo lontani dal giocatore da notare. Allo stesso tempo, è possibile usare il LOD (Level of Detail) delle mesh per far renderizzare con meno dettagli le mesh degli effetti di particelle da lontano.
Gli intervalli di visibilità sono anche un buon modo per configurare impostori per le geometrie distanti (vedi sotto).
Billboard e impostori
La versione più semplice di usare la trasparenza per gestire il LOD è quella dei billboard. Ad esempio, è possibile utilizzare un singolo quad trasparente per rappresentare un albero in lontananza. Questo può essere molto economico da renderizzare, a meno che, ovviamente, non ci siano molti alberi uno di fronte all'altro. In questo caso, la trasparenza potrebbe iniziare a incidere sul fill rate (per maggiori informazioni sul fill rate, consulta GPU optimization).
Un'alternativa è renderizzare non un solo albero, ma un gruppo di alberi insieme. Questo può essere particolarmente efficace se si può vedere un'area ma non è fisicamente possibile avvicinarsi in un gioco.
È possibile creare impostori pre-renderizzando le viste di un oggetto da diverse angolazioni. Oppure puoi andare oltre e renderizzare periodicamente una vista di un oggetto su una texture da utilizzare come impostore. A distanza, è necessario spostare l'osservatore di una distanza considerevole affinché l'angolo di vista cambi in modo significativo. Questa tecnica può essere complessa da implementare, ma potrebbe valerne la pena a seconda del tipo di progetto che stai realizzando.
Use automatic instancing
Implementato solo nel renderer Forward+, non Mobile o Compatibilità.
Se ci sono molti oggetti identici nella scena, è possibile utilizzare l'istanziamento automatico per ridurre il numero di chiamate di disegno. Questo avviene automaticamente per i nodi MeshInstance3D che utilizzano la stessa mesh e lo stesso materiale: non serve alcuna configurazione manuale.
Affinché l'istanziamento automatico sia efficace, il materiale deve essere opaco o con test alfa (alpha scissor o alpha hash). I materiali con fusione alfa o pre-passaggio di profondità non sono mai istanziati in questo modo. Invece, è necessario utilizzare MultiMesh come descritto di seguito.
Use manual instancing (MultiMesh)
Se serve disegnare più oggetti identici nello stesso punto o nelle vicinanze, prova a utilizzare MultiMesh. Un MultiMesh consente di disegnare migliaia di oggetti con un impatto minimo sulle prestazioni, rendendolo ideale per stormi, erba, particelle e qualsiasi altra cosa in cui ci siano migliaia di oggetti identici.
Consulta anche la documentazione Utilizzo di MultiMesh.
Preparazione dell'illuminazione
L'illuminazione degli oggetti è una delle operazioni di rendering più costose. L'illuminazione in tempo reale, le ombre (soprattutto da più luci) e l'illuminazione globale sono particolarmente costose. Potrebbero semplicemente essere troppo da gestire per i dispositivi mobili meno potenti.
Considera l'utilizzo di illuminazione precalcolata, soprattutto per i dispositivi mobili. Può sembrare fantastico, ma ha lo svantaggio di non essere dinamica. A volte, è un compromesso che vale la pena accettare.
Consulta Using Lightmap global illumination per istruzioni su come utilizzare le lightmap precalcolate. Per le migliori prestazioni, si consiglia di impostare la modalità di precalcolo delle luci su Static anziché su Dynamic (la predefinita), in quanto ciò salterà l'illuminazione in tempo reale sulle mesh che hanno un'illuminazione precalcolata.
Lo svantaggio delle luci con la modalità di precalcolo Static è che non possono proiettare ombre sulle mesh con illuminazione precalcolata. Questo può far apparire piatte le scene con ambienti esterni e oggetti dinamici. Un buon compromesso tra prestazioni e qualità è mantenere Dynamic per il nodo DirectionalLight3D e utilizzare Static per la maggior parte (se non tutte) le luci omnidirezionali e spot.
Animazione e skinning
L'animazione e l'animazione dei vertici, come lo skinning e il morphing, possono essere molto costose su alcune piattaforme. Potrebbe essere necessario ridurre considerevolmente il numero di poligoni per i modelli animati, oppure limitarne il numero visualizzato sullo schermo allo stesso tempo. È anche possibile ridurre la frequenza di animazione per le mesh distanti o occluse, o mettere in pausa l'animazione se è improbabile che il giocatore noti questa pausa.
I nodi VisibleOnScreenEnabler3D e VisibleOnScreenNotifier3D possono essere utili a questo scopo.
Mondi vasti
Se stai creando mondi vasti, ci sono considerazioni diverse da quelle a cui potresti essere abituato dai giochi più piccoli.
Large worlds may need to be built in tiles that can be loaded on demand as you move around the world. This can prevent memory use from getting out of hand, and also limit the processing needed to the local area.
Potrebbero inoltre verificarsi problemi di rendering e di fisica dovuti a errori di virgola mobile nei mondi vasti. Questo si può risolvere utilizzando Coordinate di mondi ampi. Se l'utilizzo di tali coordinate non è un'opzione, è possibile avvalersi di tecniche come orientare il mondo attorno al giocatore (anziché il contrario) o spostare periodicamente l'origine per mantenere tutto centrato attorno a Vector3(0, 0, 0).