PREVIOUS article

DevLog #015: Come fare a capire cosa ci manca? [18/08/2019]

NEXT article

DevLog #017: Il problema delle luci [01/09/2019]
DevLog #016: il problema della pesantezza... [25/08/2019]

Mentre ero in vacanza è stato ufficialmente rilasciato Blender 2.80 nella sua versione stabile!
Naturalmente l’ho immediatamente scaricato e credo che con buona probabilità rimarremo ancorati a questa versione per i prossimi mesi di sviluppo del progetto.
Adesso però riprendiamo il discorso da dove lo avevamo interrotto!
Dopo aver ridefinito lo storyboard e aver abbozzato l'animazione della telecamera mentre ero ancora in vacanza non ho saputo resistere e ho voluto cimentarmi in un test render dell'intera animazione...
Solo in quel momento mi sono reso conto di quanto mi sembrasse eccessivamente lento a renderizzare.
Pur considerando di aver utilizzato dei parametri relativamente bassi nelle impostazioni sia di Eevee sia del filmato in generale (per il test ho impostato al 50% di un full HD a soli 30 frame al secondo), da un rapido calcolo è emerso che per renderizzare approssimativamente un migliaio di frame ci avrebbe messo circa 6 ore.
Sicuramente 6 ore non è tanto “in assoluto”, ma data la scelta di utilizzare Eevee al posto di Cycles per lavorare in “quasi-real-time” e viste le meraviglie che è in grado di generare e gestire questo motore di rendering… beh mi aspettavo un risultato migliore. Allora ho iniziato ad indagare.
È bastata una minima profilazione per accorgermi subito di un primo problema: durante il rendering uno solo dei Core disponibili del processore viene utilizzato al 100%.
Una piccola indagine e ho scoperto che Eevee sfrutta molto l'hardware della scheda grafica per fare i suoi conti e sfortunatamente sembra che la scheda grafica integrata della Intel nonché unica scheda grafica del mio portatile non sia supportata per l'accelerazione hardware dei calcoli (o non sia abbastanza performante, non saprei dire) di conseguenza tutto il carico computazionale è spostato sul processore. Sfortunatamente però pare che fino al passaggio completo dalla attuale architettura opengl alle più recenti vulkan (ci stanno già lavorando ma non è incluso nella 2.80), Eevee non sarà in grado di sfruttare tutti i core disponibili nel processore lavorando invece su uno solo.
Ecco che di colpo alcune delle paure sulla qualità/dettaglio/peso degli asset che abbiamo realizzato pian piano prendono forma.
Ho iniziato quindi a interessarmi alla “pesantezza” della scena. Consideriamo che la composizione in questione è stata assemblata “linkando” (si può dire?) esternamente i vari asset. Basandomi sui numeri riportati direttamente da Blender come statistiche (nella barra di stato in basso a destra della finestra del programma) pare che la scena sia attualmente composta da circa 1 400 000 facce o meglio 2 800 000 triangoli. È tanto? È poco? Non saprei.
Fino a questo momento non mi ero preoccupato di tenere d'occhio queste statistiche e non so nemmeno dire quanto siano affidabili o rappresentative e soprattutto non ho esperienza sufficiente per poter dire se sia tanto o poco, ma ho deciso comunque di passare in rassegna uno ad uno tutti gli asset realizzati fino a questo momento per valutare dove e come fosse possibile apportare delle ottimizzazioni senza andare a perdere nella qualità finale.
Non c'è voluto molto per capire che abbiamo abusato tutti indiscriminatamente del subdivision-surface modifier.
Questa tecnica è un tipo di intervento non distruttivo (quindi modificabile anche a posteriori tramite parametri) e ci si sta rivoltando contro perché appesantisce “inutilmente” molti asset che non avrebbero bisogno di quel livello di suddivisione e di dettaglio.
Mi è bastato semplicemente ridurre anche solo di uno step di suddivisione il modificatore negli asset in cui era stato utilizzato in modo eccessivo, per portare senza sforzo e senza nessuna riduzione della qualità visibile del rendering la scena da 2 800 000 triangoli a circa 1 300 000 triangoli, quindi meno della metà!
Pur senza elementi per valutare questi numeri mi sono sentito sollevato anche se procedendo con nuovi test di performance nel rendering non ho percepito il consistente miglioramento nella riduzione dei tempi di calcolo che mi sarei aspettato.
A questo punto Il dubbio è diventato se fosse più performante un solo Core di un processore i7 di ultima generazione oppure un pc di 6 anni fa dotato di una scheda video di fascia medio-bassa acquistata solo un paio di anni fa?
E siccome sto scrivendo questo articolo dopo essere tornato dalle vacanze ovviamente una delle prime cose che ho fatto è stato togliermi questo dubbio e posso darvi direttamente il risultato finale: il mio vecchio PC di casa con scheda video di fascia medio/bassa (per la precisione una Nvidia 1060) renderizza la stessa scena in 6 secondi contro i 36 secondi sul mio portatile senza scheda video discreta ma dotato di un processore Intel i7 di ultima generazione.

NOTA: prendete questo test per quello che è, cioè una comparativa di performance renderizzando la stessa scena su 2 hardware differenti utilizzando Eevee in Blender 2.80. Non vuole essere un test esaustivo né vuole indicare che un determinato hardware o software funzionino meglio o peggio in senso assoluto. Sono convinto che nelle release future di Blender con l’adozione delle Vulkan questi risultati possano essere rimessi in discussione, quindi usateli come dato statistico senza secondi fini.