Archives

0

Sotto il cofano... Parte IV

CiacioZ 5.2.14 ,
Giuro che questo è l'ultimo post della serie "Sotto il cofano... Parte X", li avrei cambiati anche prima ma siccome sono un precisino mi avrebbe dato fastidio come la sabbia nel letto avere dei titoli non uniformi quindi a malincuore mi è toccato proseguire con la serie... prima di inorridire ricordo a tutti che sono un programmatore.

Detto questo, dopo la prima puntata con la panoramica sull'architettura generale, la parte sull'AssetManaer e il post sullo ScriptManager eccoci arrivati all'ultimo pezzo del motore: la Presentation!

Questo strato del motore è quello che si occupa di visualizzare le entità del gioco e gestire l'interazione con l'utente.
Essendo anche questa parte trasparente rispetto agli alti elementi, può essere implementata in qualsiasi modo rendendola quindi indipendente dalla libreria utilizzata.
La mia scelta per esempio è stata quella di utilizzare il binding per .NET della libreria SFML che rivaleggia più o meno sullo stesso piano della più famosa SDL.
Come mai la scelta è ricaduta sulla prima? Principalmente perché leggendo alcune comparative mi sembra più performante e moderna implementando per esempio l'accelerazione tramite GPU (non che il mio gioco ne abbia bisogno per carità) oltre al fatto di avere un binding con .NET aggiornato.

Quello che a prima vista può sembrare lo strato più semplice in realtà è quello che mi ha fatto avvicinare di più alla dannazione eterna a causa di possenti invocazioni dal forte tono dispregiativo verso divinità di ogni sorta.
Già perché quando si ha a che fare con funzioni che utilizzano la scheda grafica il rischio di sbagliare qualcosa e far precipitare le prestazioni a livello CryEngine che gira su Commodore64 è un dietro l'angolo.
Non basta infatti chiamare una funzione che visualizza i byte dell'immagine dell'omino a schemo per essere tranquilli ma il modo in cui vengono istanziati gli oggetti e il numero di chiamate effettuate alla funzione che "disegna" su schermo possono fare una differenza enorme tra un risultato ottimo o uno mediocre.

In questa libreria per esempio ogni cosa che si vuole visualizzare a schermo passa da un oggetto Texture che può essere passato alla funzione "Draw" che lo renderizzerà a schermo.
Istanziare ad ogni ciclo le Texture, le dimensioni delle stesse e il modo in cui vengono gestite e passate alla funzione Draw incidono parecchio e purtroppo vista la documentazione un po'scarsa mi sono dovuto barcamenare tra l'approccio a tentoni, richieste sul forum ed esempi presi da articoli fatti da altri utilizzatori.

Ad esempio visto che col mio portatile il background in HD di una locazione non riesce a stare in un unico oggetto Texture ho dovuto suddividerlo in porzioni più piccole e ricomponendolo tipo puzzle in fase di visualizzazione. Questo approccio però aveva portato ad un aumento delle chiamate alla funzione "Draw" della libreria con conseguente crollo delle performance.
La soluzione, dopo aver camminato sui muri, vomitato verde e incendiato crocifissi con la sola imposizione della fiatella, ho scoperto essere quella di gestire le Texture tramite il VertexBuffer.
Vi risparmio i dettagli ma in pratica consiste nel definire un poligono di "Vertex" a cui viene associata la parte di Texture dello sfondo. 
Questo è un approccio molto più gradito dalla scheda video che come per magilla torna a processare frame come se non ci fosse un domani (tranne sempre sul mio portatile ma per lui il domani è sempre più incerto).

Per adesso, nonostante la libreria offra già delle possibilità legate al 3D, mi concentrerò su un approccio 2D come le care vecchie avventure LucasFilm/Arts.
In futuro, se e quando sarà finito il motore, magari valuterò di evolverlo introducendo il 3D ma per quello c'è ancora molta strada oltre che una moltitudine in più di librerie con ottimi binding per .NET da valutare come per esempio: il MOGRE (binding .NET per la libreria Ogre) o il NeoAxis sempre basato sull'Ogre.

Se già con un semplice approccio 2D ho avuto scomuniche da parte di quasi tutte le religioni del pianeta non oso immaginare cosa succederebbe se dovesse entrare in gioco la terza dimensione con l'introduzione di concetti come Camera, Luci, Poligoni, Texture etc. probabilmente farei la fine di Gozer il gozeriano*.






*Se non sapete di chi sto parlando lasciate subito questo blog.

 
Copyright 2010 Alone in the Code