Ottimizzare Unreal Engine – Parte 1

Come analizzare le performance di una scena in Unreal Engine

Software: Unreal Engine 4.19.2
Plug-in: RenderDoc (gratuito)
Hardware utilizzato: CPU Intel i7-6900K (8+8 core) | GPU GTX 1060 6GB

Il mondo di Unreal Engine è molto diverso da quello a cui siamo abituati con 3D Studio Max. Innanzitutto Unreal è un Game Engine e non può quindi essere utilizzato come un comune software di rendering. Il problema nell’utilizzare un software con render in real-time è principalmente il dover fare molta attenzione alle performance, cioè a non superare il limite massimo del tempo impiegato a renderizzare il singolo frame. In base all’hardware su cui il ‘gioco’ sarà distribuito avremo un diverso target di Frame Per Seconds (FPS), anche espresso in millisecondi (ms). Ad esempio nel caso degli headset VR il target è 90 FPS, il chè vuol dire che ogni frame deve essere renderizzato in 11.1 ms durante l’intero gioco.

Il processo di analisi delle performance e la successiva ottimizzazione della scena sono due processi indispensabili nella creazione del progetto. Per ottimizzare una scena però è prima necessario analizzare dove sono i problemi, in modo anche da evitare di dover ottimizzare tutta la scena ma concentrare il lavoro solo nelle zone che più lo richiedono.
In questo tutorial vedremo una piccola parte dell’analisi delle performance per capire cosa rallenta il rendering all’interno della scena.

Utilizzeremo come scena di esempio il progetto del San Francisco Loft.
Alcune note sul progetto prima di procedere:

  • la scena è realizzata con luci statiche, in questo modo sappiamo già che luci e ombre non saranno un problema per le performance.
  • nella scena non è presente alcun tipo di ottimizzazione.

Per analizzare la scena, o meglio un frame, utilizzeremo un software esterno ad Unreal Engine: RenderDoc (nella sezione plugin di UE è già preinstallato il plugin per comunicare con renderdoc, bisogna solo scaricare il software).

All’interno della scena abbiamo scelto di analizzare questo frame, essendo una fra i più ‘pesanti’, impiega infatti 15.18ms per essere renderizzato, siamo quindi oltre il limite di 11.1 ms:

Proviamo a capire quali possono essere i problemi:

  • il valore di Draw (CPU) è 0.09 ms
  • il valore di GPU è 15.17 ms

Il rallentamento del rendering è sicuramente dovuto alla GPU.
Apriamo ora il frame in RenderDoc che ci aiuterà a capire dove viene speso il maggior tempo all’interno di quei 15.17ms.

La viewport di RenderDoc è piena di informazioni, per fortuna a noi ne servono solo alcune.

Prima di tutto sulla sinistra abbiamo l’Event Browser da cui possiamo vedere quanto tempo impiega ogni singola draw call ad essere renderizzata dalla GPU:

  • in blu è evidenziato il gruppo che riguarda la ‘costruzione’ della scena, cioè il rendering di ogni singolo oggetto presente al suo interno (chiamato BasePass)
  • in giallo è evidenziato il processo di calcolo necessario per creare le riflessioni utilizzate dalle PlanarReflection (sono uno dei tipi di riflessioni disponibili in Unreal)

Confrontando il tempo impiegato nel calcolo delle PlanarReflections e il tempo impiegato per renderizzare la scena notiamo che sono molto simili:

  • Scene PlanarReflection 11.79ms
  • Scene “BasePass” 11.32ms (linea blu)

Se non avete già indovinato, il motivo è che Unreal per poter creare le riflessioni utilizzate dalle Planar Reflections renderizza la scena due volte: prima crea la scena specchiata poi crea la scena completa, il chè può diventare un rallentamento piuttosto importante.

A sinistra vedete il rendering delle Planar Reflections, a destra il frame completo. Da notare che viene impiegato più tempo per renderizzare un frame in cui ¾ dell’immagine è nera rispetto al frame della scena finale.

Le riflessioni sono solo uno dei problemi che riguardano questa scena. Nel seguito di questo tutorial procederemo ad un’analisi più approfondita per scoprire ulteriori elementi che rallentano il rendering utilizzando altri strumenti a disposizione in RenderDoc.

A presto per la seconda parte,
Enrico

 

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.