L'arrivo di Windows Vista comporterà anche l'introduzione delle nuove
API DirectX 10 sviluppate da Microsoft. Per la prima volta nella storia delle
DirectX, assistiamo ad una riprogettazione da zero, tanto che fino a
qualche tempo fa, il big di Redmond aveva paventato la possibilità di
cambiare anche la loro denominazione in WGF 1.0 (Windows Graphics
Foundation).
Questo sta a significare che le novità che Microsoft si appresta ad
introdurre con la versione 10 delle API sono davvero tante, mirate per
la maggior parte ad ottenere prestazioni superiori. Rispetto
alle DirectX 9, in particolare, le DirectX 10 supportano funzioni di geometry shaders, stream output,
geometry instancing migliorate e riduzione dell'overhead sulla CPU
durante i trasferimenti da CPU a GPU.
Prima di procedere oltre, però, è bene fare una breve introduzione
relativa al ruolo ricoperto dalle DirectX. Precedentemente all'introduzione delle API per la
programmazione della grafica, le applicazioni 3D comandavano
direttamente l'hardware attraverso un linguaggio di
programmazione molto a basso livello. Questo modo di agire
permetteva di ottenere prestazioni molto elevate, ma le applicazioni
dovevano gestire comandi diversi per hardware diversi. I risultati erano
quelli di uno sviluppo molto difficoltoso, pieno di errori e con
prodotti non funzionanti a priori su qualunque hardware. Con
la crescita dell'offerta di dispositivi hardware dedicati alla grafica
3D, un approccio di questo genere diventava sempre più impraticabile. Serviva, a questo punto, un
layer che potesse fare da traduttore fra
le applicazioni 3D e l'hardware sottostante. A tal proposito furono,
perciò, progettate le API DirectX ed OpenGL.
Con questa novità, il
modello di programmazione cambia radicalmente: le applicazioni
possono
implementare solo il codice necessario alla propria logica mentre le API
si preoccupano di tradurre tale codice in istruzioni capibili
dall'hardware sottostante. Tale principio, alla base di qualunque
programma software scritto secondo il paradigma Object Oriented, porta
lo sviluppatore a concentrarsi solo sulla logica di business del suo
prodotto, ignorando completamente le problematiche legate all'hardware
sul quale esso dovrà girare. Per contro, però, l'introduzione di un nuovo layer nella catena di
esecuzione del software comporta un certo decadimento delle prestazioni.
Ogni volta che le DirectX ricevono un comando dall'applicazione, questo
deve essere processato prima di sapere come indirizzarlo verso il
dispositivo hardware.
Fino alla versione 9 delle API, il processo di "traduzione" del
comando veniva eseguito sulla CPU: dunque tutti i comandi 3D causavano
un overhead sulla CPU (un sovraccarico) che si traduce in due problemi
per la catena di produzione delle scene 3D, ovvero un limite al
numero di oggetti che possono essere renderizzati ed un limite al numero
di effetti che possono essere applicati alla scena.
In merito al primo problema, poiché ogni chiamata dell'applicazione
alle API genera un overhead fisso, solo un numero finito di chiamate può
essere indirizzato alle API prima che il sistema diventi "CPU limited" e
dunque solo un numero limitato di oggetti può essere disegnato. Gli
sviluppatori si sono ingegnati in vari modi per risolvere questo
problema ed una delle tecniche più efficaci consiste nel fare un batch
degli oggetti da disegnare, ovvero raggruppare un certo numero di
oggetti e fare una sola chiamata. Purtroppo, però, la tecnica funziona
solo con oggetti uguali che non differiscono per le proprietà del
materiale.
Riguardo la seconda problematica, essa risulta in una limitata
ricchezza di particolari visivi dell'applicazione. Le API, infatti, non
vengono chiamate solo per disegnare oggetti ma anche per cambiare
texture, shader, formato dei vertici e modalità di blending: ognuno di
questi cambiamenti causa un sovraccarico sulla CPU non indifferente ma
allo stesso tempo è cruciale per offrire una visione degli ambienti di
gioco unica. Addirittura i cambiamenti di stato potrebbero accadere più
spesso delle chiamate per disegnare gli oggetti, in quanto su un singolo
oggetto della scena 3D potrebbero essere applicati effetti multipli.
Finora le uniche soluzioni a questo problema sono state due: quella
ovvia di non utilizzare troppi cambiamenti di stato, applicando una
scarsa varietà di texture ed effetti alle scene del gioco ed una che
prevede di incollare assieme molte piccole texture in una singola
texture (texture atlas) di dimensioni maggiori. Anche quest'ultimo
approccio ha però i suoi limiti che si concretizzano in una texture di
dimensioni massime di 4048 x 4048 pixel prevista nelle DirectX 9.