La vegetazione densa raramente viene uccisa dal solo conteggio dei triangoli: muore per mille draw call, overdraw da alpha card incaute, e ombre che nessuno ricordava fossero attive. Spendi il tuo sforzo in quest'ordine: instancing prima, distanze di cull seconde, ombre terze, LOD quarti, posizionamento per densità quinto, e verifica ogni passo con la stessa camera fissa, una variabile per volta, o non imparerai nulla. Questa guida copre ogni fase con la firma del profiler che ti dice che è il tuo problema.
Una foresta vera si renderizza "gratis" perché la fisica è massicciamente parallela. La tua GPU può falsificare il look a 60 fps, ma solo se smetti di sabotare la macchineria che i motori già spediscono per esattamente questo lavoro.
Il modello mentale: cinque colli di bottiglia, un ordine
La performance della vegetazione non è un problema, sono cinque, e dominano in una sequenza prevedibile. Le draw call legano prima la CPU; la distanza di cull decide quanto stai persino chiedendo alla GPU di disegnare; le ombre raddoppiano silenziosamente il costo di tutto ciò che le proietta; LOD e overdraw governano il conto per pixel; e il posizionamento per densità decide quanto di tutto questo ti serviva davvero. Attaccali in disordine e ottimizzerai qualcosa che non era il collo di bottiglia. L'ordine sotto è quello in cui i costi mordono davvero.
Instancing prima, tutto il resto dopo
Un albero disegnato 5.000 volte è radicalmente più economico di 5.000 alberi individuali: entrambi i motori raggruppano mesh ripetute in draw istanziati, e il tuo primo compito è semplicemente non sabotare quella macchineria.
Unreal raggruppa tramite foliage e hierarchical instanced static meshes; Unity tramite GPU instancing e dettagli del terreno. Cosa rompe silenziosamente il raggruppamento:
- vegetazione posta come attori/oggetti unici invece che istanze;
- varianti di materiale per istanza: usa dati per istanza (colore, scala) dentro un materiale invece di crearne uno per look;
- posizionamento sparso organizzativamente, così che il motore non possa cullare i cluster come unità.
Il segnale al profiler è inequivocabile: draw call che scalano con il numero di piante. Se una vista di foresta mostra migliaia di draw call, sistema questo prima di toccare qualsiasi altra cosa; nulla più in basso in questa lista ti salverà, perché sei CPU-bound prima ancora che la GPU parta. La vegetazione istanziata sana tiene draw call nelle basse centinaia per un'intera vista di foresta, indipendentemente da quante migliaia di piante ci siano.
Le distanze di cull sono soldi gratis
L'erba non ha bisogno di renderizzarsi a 800 metri: imposta distanze di cull per tipo (copertura di terra 30–60 m, cespugli 100–200 m, solo gli alberi meritano lunghe distanze) con range di fade per nascondere il pop.
Questa è l'impostazione a più alto valore per minuto dell'intera pipeline, e viene lasciata di routine a "infinito" perché è lì di default e nessuno se ne accorge. Il ragionamento è percettivo: la copertura di terra sottende meno di un pixel ben prima dei 100 m; non contribuisce letteralmente nulla all'immagine finale mentre costa ancora vertici, overdraw e lavoro d'ombra ogni frame. La copertura lontana appartiene a sistemi più economici: il colore del materiale del terreno, impostor opachi, o semplicemente il LOD lontano dello strato di terreno dipinto del verde giusto.
I range di fade (dithered o alpha) nascondono il pop-out così i giocatori non vedono mai la distanza di cull stessa. Regola il fade quel tanto che basta a essere invisibile e non di più: un fade troppo lungo significa che paghi due rappresentazioni della stessa pianta durante il crossfade.
Ombre: la metà silenziosa del conto
Spegni la proiezione di ombre dinamiche per la piccola copertura di terra, tienila per gli alberi, e limitala per distanza per i cespugli. Le ombre dell'erba raddoppiano il costo per un guadagno visivo quasi nullo.
Ogni filo d'erba nel pass delle ombre viene disegnato di nuovo, dal punto di vista della luce. In scene dense il pass delle ombre spesso costa quanto il pass base, il che significa che le ombre dell'erba possono essere la singola voce più grande di tutto il budget vegetazione pur essendo visivamente indistinguibili da un semplice scurimento ambientale alla base del ciuffo. Il rimedio è quasi gratis: proiezione d'ombra spenta per la copertura di terra, accesa per gli alberi (le loro ombre fanno lavoro compositivo reale), limitata per distanza per il tramezzo. Poi controlla il pass delle ombre nel tuo profiler prima e dopo: di solito è la vittoria singola più grande dopo l'instancing, e ci vogliono minuti.
LOD: budgeta la silhouette, non i poligoni
Una buona catena di LOD di vegetazione preserva il contorno e massacra l'interno: verifica le distanze di transizione a occhio, e ottimizza più duramente l'ultimo mesh LOD prima dell'impostor, perché quello è a schermo in ogni inquadratura larga.
Le piante di strato basso come queste sono dove le impostazioni di distanza di cull e ombra pagano di più: migliaia di istanze, ciascuna che contribuisce quasi nulla oltre qualche decina di metri, ciascuna che raddoppia di costo se proietta un'ombra dinamica.
Una catena pratica per un albero eroe: mesh completa → riduzione dell'interno ~50 % (stessa silhouette) → ~15 % con card fuse → impostor/billboard opaco. Due note che risparmiano dolore reale:
- Anche nei motori con geometria virtualizzata, gli impostor lontani restano convenienti, perché overdraw e ombre restano costi reali indipendentemente da come si pagano i triangoli. La geometria virtualizzata risolve il conteggio dei triangoli, non il costo di trasparenza.
- La trasparenza è la nemica alla distanza. Le card alpha-tested dense impilano overdraw esattamente dove la GPU è più debole: i LOD di mezzo. Preferisci foglie in mesh da vicino e impostor opachi da lontano; il mezzo carico di alpha è dove si nasconde il tempo di frame. Se un LOD è misteriosamente costoso, è quasi sempre quello trasparente.
Overdraw: il costo che non puoi vedere
L'overdraw è la GPU che ombreggia lo stesso pixel più volte attraverso superfici trasparenti impilate: la maledizione specifica della vegetazione, invisibile nell'immagine finale, e spesso il motivo per cui una scena "leggera" è lenta.
La maggior parte dei motori ha una modalità di visualizzazione dell'overdraw; accendila e guarda un campo d'erba. Se brilla bianco, stai ombreggiando ogni pixel cinque o dieci volte mentre le card alpha sovrapposte si accumulano. Mitigazioni: meno fili, più grandi, invece di molti sottili; geometria opaca dove la silhouette lo consente; e cull aggressivo delle card che contribuiscono meno. L'overdraw è il colpevole classico del "la mia scena è lenta ma nulla sembra costoso", perché i triangoli sono economici e i pixel vengono pagati molte volte.
La densità è una decisione di design, non una posizione di slider
Densa dove il giocatore cammina e guarda, rada dove no: una fascia di 20 m di dettaglio ricco lungo il sentiero si legge come "rigoglioso ovunque" a una frazione del costo uniforme.
Le maschere di pendenza e altezza ne fanno parte automaticamente (le facce ripide e gli altipiani lontani non hanno bisogno di copertura di terra affatto), e il clustering fa il resto: i ciuffi con vuoti si renderizzano più economici del riempimento uniforme e sembrano più naturali, così che la vittoria di performance e quella di bellezza puntano nella stessa direzione. È qui che gli strumenti di posizionamento si guadagnano il pane: dipingere densità con maschere e regole per specie, poi cuocere direttamente in istanze native del motore, è la differenza tra un pomeriggio e una settimana. È il cuore di ciò che fa lo scatter di Numivo, e poiché cuoce in foliage ordinario e mesh istanziate, ogni tecnica di questo articolo si applica invariata al risultato. Non c'è runtime di plugin tra te e le ottimizzazioni standard; la scena cotta è solo contenuto del motore.
Il loop di profiling
Stessa camera, stessa vista, una variabile per volta: misura il tempo di frame GPU, le draw call, il pass delle ombre e l'overdraw dopo ogni cambiamento.
Scegli una "camera di budget" fissa nella tua vista più densa e cattura le stat prima e dopo ogni passo sopra. La disciplina conta perché le ottimizzazioni di vegetazione interagiscono: un cambio di distanza di cull altera quante istanze vede il pass delle ombre; un cambio di LOD altera l'overdraw; un cambio di densità le altera tutte insieme. I sorvoli casuali producono numeri casuali e argomenti infalsificabili su se un cambiamento abbia aiutato. Le camere fisse producono decisioni che puoi difendere. Tieni i numeri in un foglio condiviso e la linea di tendenza ti racconta la storia che una singola misurazione non può.
Numeri sul campo che vale la pena rubare
- Cull della copertura di terra: 30–60 m · cespugli: 100–200 m · alberi: linea di vista
- Draw call per una vista di foresta istanziata sana: basse centinaia
- Quota del pass delle ombre in scene dense: spesso ~la metà del costo vegetazione; le ombre dell'erba spente sono la vittoria grande più economica che esista
- Larghezza della fascia di dressing del sentiero che legge "rigoglioso ovunque": ~20 m
- Numero di LOD per un albero eroe: 3 mesh LOD + impostor opaco
- Obiettivo di overdraw per l'erba: meno di ~3× nella vista overdraw, non l'8–10× bianco acceso delle card alpha impilate
Mini-FAQ
Nanite / la geometria virtualizzata rende questo obsoleto? Cambia quali voci dominano, non la disciplina. L'overdraw dalle alpha card, il costo delle ombre e l'overhead per istanza restano tutti, e gli impostor alla distanza pagano ancora. Misura sul tuo hardware target invece di assumere che la nuova tecnologia abbia risolto il tuo specifico collo di bottiglia: potrebbe averlo spostato, non rimosso.
Perché la mia scena è lenta anche a bassa densità? I soliti sospetti, in ordine: erba che proietta ombre dinamiche, un materiale unico per variante che sabota il raggruppamento, distanze di cull all'infinito, o una catena di LOD alpha-tested che impila overdraw. Ciascuno ha una firma di profiler distinta: controlla prima di cambiare, o sistemerai quello sbagliato.
Quanto è "troppo densa" per il gameplay? La leggibilità in combattimento limita la densità prima della performance: se le silhouette svaniscono nel disordine, i giocatori danno la colpa al gioco, non al dressing. Densa nella vista, moderata nell'arena è il pattern che sopravvive sia al profiler sia al playtest.
Cuocere o tenere procedurale? Cuoci per la spedizione: le istanze cotte profilano onestamente e spediscono senza dipendenza runtime. Tieni il setup procedurale (maschere, regole, seed) nel controllo di versione così puoi ri-cuocere dopo un cambio di terreno senza rifare il lavoro a mano.
Dall'aspetto denso e veloce non è una contraddizione: è per lo più la disciplina di fare cinque cose nell'ordine giusto e dimostrare ognuna con la stessa camera.