Unreal Engine 4: gli strumenti, come funziona, cosa cambia
Riprendiamo l'analisi delle caratteristiche più importanti di Unreal Engine 4, in modo da poter capire come funziona alla base un motore grafico di ultima generazione con tutte le sue funzioni, gli strumenti e le varie opzioni grafiche.
di Rosario Grasso pubblicato il 28 Luglio 2015 nel canale VideogamesEpic
Bilanciare la qualità con le prestazioni con CPU collo di bottiglia
Se ci si ritrova invece nel caso in cui il collo di bottiglia è la CPU, allora questo potrebbe dipendere dalle chiamate al sistema video (draw call). Si tratta di una sfida che gli sviluppatori si trovano molto spesso a combattere, dovendosi inventare delle soluzioni alle volte arzigogolate proprio al fine di ridurre il più possibile le draw call. Ad esempio, si possono gestire vari muri della scena tridimensionale con la stessa mesh, in modo da ridurre il numero delle chiamate necessarie per questo elemento grafico.
Il thread del rendering ha bisogno di processare individualmente ogni oggetto, che può essere del tipo materiali o luci, collisioni, e di elaborare ogni aggiornamento a questi oggetti. Deve poi preparare i comandi da impartire alla GPU per ogni draw call e fare l'effettiva chiamata alle API. Le DirectX a questo punto convalidano i dati e passano le informazioni alla scheda video. Qui i driver del fornitore del chip grafico convalidano ulteriormente e creano un buffer con i comandi per l'hardware.
Tutte queste chiamate possono essere monitorate all'interno di Ue4 con lo strumento Mesh Draw Calls. Si possono ridurre diminuendo il numero di oggetti o la distanza visiva, o eliminando quegli oggetti che necessitano di essere renderizzati più volte durante l'azione. Si potrebbe decidere anche di ridurre il numero di materiali o riutilizzare lo stesso materiale per più oggetti. Usare texture grandi invece che tante texture è un altro espediente per ridurre il numero di chiamate al sistema video, così come utilizzare pixel shader più semplici per i materiali. Altro suggerimento potrebbe essere quello di disabilitare certe caratteristiche delle mesh come la capacità di proiettare ombre. Infine, si può cambiare il comportamento delle fonti di illuminazione in modo che non proiettino ombre, emanino coni di luce meno complessi o si caratterizzino per raggi di attenuazione più piccoli.
Le ultime tecniche di rendering usano l'istanziazione dell'hardware, ovvero usare elementi grafici già calcolati, e modificati in minima parte, per molti oggetti. Si tratta di un sistema che riduce l'overhead ai driver per ogni draw call ma ovviamente limita la flessibilità. Più che per le mesh, quindi, conviene usarlo per gli effetti particellari o la vegetazione.
Sui PC di fascia alta di oggi si possono avere migliaia di draw call per ogni frame con le API DirectX 11 o OpenGL. Le API di nuova generazione, che affrontano il problema dell'overhead dei driver che si verifica in presenza di molte draw call, possono fare numeri anche superiori. Ed è per questo che si dice che le DirectX 12, ovviamente in presenza di hardware che gestisca le chiamate al sistema video in maniera dinamica, miglioreranno in maniera sensibile le prestazioni. Su mobile, in presenza di standard come OpenGL ES2 e OpenGL ES3, il numero delle chiamate è sull'ordine delle centinaia, ma anche in questo caso si assiste a un miglioramento consentito da API come Apple Metal simile a quello che si avrà con le DirectX 12.
Bisogna sempre ricordare che assegnare un materiale a uno sprite è un'operazione che fa aumentare il numero di istruzioni da processare; così come associare a sua volta una traslucenza allo sprite comporta un'altra istruzione, e così via. Più strati inseriamo alla nostra grafica e maggiori saranno i costi di elaborazione, aumentando l'overdraw della GPU. Quest'ultimo viene definito, nella sua formula più semplice, con questa equazione:
In termini più pratici si tratta del prodotto tra la quantità di schermo occupata dagli effetti grafici da processare e il numero di istruzioni necessarie per calcolare ciascuno di questi effetti.