|
Abbiamo capito all'incirca come funziona e che cosa
significa architettura Tile Based, ora vogliamo entrare un pochino più nello
specifico ed analizzare pregi e difetti di questa modo di pensare.
Partiamo a tal proposito dalla generazione della scena 3D
che si compone, di solito, di diverse fasi. Queste sono, nell'ordine:
trasformazione, illuminazione, setup, rendering e Z-buffering.
La prima fase di trasformazione della scena serve a
determinare la posizione di tutti i vertici dei triangoli che andranno a
comporre la scena 3D, siano essi in movimento che fermi. Dopo questa fase si
passa alla costruzione di uno scheletro della scena mediante l'uso di poligoni
che dovranno essere, quindi, illuminati. A questo pensa la seconda fase, quella
di illuminazione della scena, che calcola le ombre e le zone in luce di tutta la
scena. Queste prime due operazioni vengono svolte dalla CPU oppure dalla scheda
video a seconda se quest'ultima non possiede oppure possiede una unità di
T&L hardware.
Il setup dei triangoli costituisce il terzo passo nella
costruzione della scena 3D. In questa fase vengono creati i veri e propri
triangoli a partire dalla posizione dei vertici assegnata nella prima fase.
Tutti i triangoli generati verranno, poi, renderizzati, cioè, verranno vestiti
(applicazione delle textures "addosso" agli oggetti). Questa è la
quarta fase, quella di rendering.
L'ultima fase, quella sulla quale ci concentreremo
maggiormente, serve ad elaborare la posizione degli oggetti creati finora nello
spazio tridimensionale. Lo Z-Buffering, infatti, serve a calcolare la posizione
all'interno della scena di tutti gli oggetti; questa operazione si avvale di un
buffer di memoria chiamato appunto Z-Buffer, nel quale troviamo tutti gli
oggetti necessari alla corretta visualizzazione della scena in ordine di
profondità. Il suo funzionamento è di facile comprensione: una volta disegnato
un triangolo della scena viene calcolata, per ogni pixel, la distanza
dall'osservatore. Tutti questi dati vengono poi inseriti nello Z-Buffer che se
opportunamente dimensionato offre sempre una perfetta visualizzazione della
scena. Ogni volta che viene generato un nuovo triangolo, prima di renderlo
visibile all'osservatore, vengono eseguiti i calcoli sulla coordinata z e questi
vengono confrontati con le coordinate degli oggetti che già si trovano
all'interno dello Z-Buffer. I pixel cha hanno una coordinata z minore di altri
sono quelli che si trovano più vicini all'osservatore e dunque davanti ad altri
pixel: questi vanno disegnati. Viceversa si tratta di pixel nascosti da altri e
quindi non visibili e da non disegnare sullo schermo. Finora il semplice uso di
uno Z-Buffer accurato ha fornito prestazioni più che accettabili. Adesso, che i
giochi (e anche i giocatori) sono sempre più affamati di risorse, la larghezza
di banda delle memorie grafiche non riesce più a garantire prestazioni ottimali
per il passaggio di tutti i dati indistintamente attraverso tutte le fasi di
costruzione dell'immagine.
Dunque, come avete capito, è proprio nello Z-Buffer che si scopre quali sono i pixel che verranno
coperti da altri che gli stanno davanti. Qualcuno a questo punto si è chiesto:
ma perché portarsi dietro una marea di informazioni inutili che poi non
verranno affatto viste dall'utente sul suo monitor?
La risposta a questa domanda non è data solo dal chip
PowerVR, ma anche da ATI e nVidia. Chiaramente ognuno sta procedendo per la sua
strada diversa da quella dell'altro ma sempre con lo stesso obiettivo:
ottimizzare l'occupazione delle risorse. Basti pensare che almeno il 50% dei
calcoli sviluppati per la costruzione dei triangoli si materializza poi in pixel
nascosti e quindi da buttare via. Ecco perché c'è molta attenzione verso le
tecniche atte ad eliminare l'OverDrawing. Quelle di ATI e nVidia, comunque, non
sono tecniche molto distanti dal classico uso dello Z-Buffering tanto che
possiamo indicare queste tecniche come una ottimizzazione dello Z-Buffer stesso
(Hyper-Z è la tecnologia usata da ATI e Z-Occlusion Culling quella usata da
nVidia nel GeForce 3). Inoltre queste tecniche richiedono anche una parte di
sviluppo software per avere una reale ottimizzazione e dunque non sono
"retroattive".
Altro discorso è quello che sta dietro le tecnologie
sviluppate da PowerVR e introdotte nel chip Kyro II. Queste tecniche hanno un
approccio sulle operazioni da compiere nella creazione della scena 3D molto più
radicali che non quelle introdotte dai concorrenti. L'idea che sta nel PowerVR è proprio quella di eliminare alla
fonte le
parti della scena che non verranno visualizzate perché coperte da altre, in modo da evitare di portarsi dietro un fardello di informazioni che poi
verranno buttate ed evitare il collo di bottiglia causato dalla larghezza di
banda della memoria.
Innanzi tutto, il fatto di splittare la scena in tanti
piccoli pezzi, permette di effettuare la maggior parte delle operazioni on-chip
evitando l'accesso alla memoria esterna (ogni singolo tassello è molto leggero,
dunque richiede buffer altrettanto piccoli per essere memorizzato durante le
varie operazioni che la GPU deve compiere). Anche le funzioni di HSR sono fatte
tutte attraverso lo Z-Buffer integrato nel chip, oltre che quelle di
processamento dei pixel e di blending che vengono svolte on-chip mediante l'uso
di un Frame Buffer interno. Già questo fatto permette un elevato risparmio
sulla bandwidth della memoria perché la maggior parte degli accessi alla
memoria, in sistemi convenzionali, avvengono proprio per le operazioni sopra
citate. Ma i vantaggi offerti dal Kyro II non finiscono qui. Infatti tutte le
operazioni interne al chip vengono fatte a 32-bit senza perdita di performance
dato che non c'è bisogno di attendere le risposte da Frame Buffer e/o Z-Buffer
esterni. Questo fa sì che anche una visualizzazione finale della scena a
profondità di colore e texture di soli 16-bit, sia di ottima qualità.
Passiamo, poi, alla tecnica di Hidden Surface Removal
adottata in questo chip. Intanto osserviamo la figura qui sotto in
contrapposizione con quella vista precedentemente:
Come vedete, stavolta la prima fase consiste nel calcolo
della distanza sull'asse z, che permette di sapere già dal primo stadio della
pipeline grafica quello che accade ad ogni pixel e dunque la sua visibilità o
meno. Solo i pixel che saranno visibili verranno inviati alle unità di Texture
e Shade per essere resi, infine, visibili sul monitor.
1. Nella prima fase non si fa nessun accesso all'area di memoria
esterna dedicata allo Z-Buffer ma si usa lo Z-Buffer interno al chip per la
misura della coordinata z di ogni pixel. Come si evita di accedere alla
memoria video esterna? Il discorso lo abbiamo già affrontato precedentemente
ma ora potrebbe risultare ancora più chiaro. Questo può accadere grazie alla
suddivisione della scena in blocchetti di 32x16 pixel. Ad esempio una
schermata di 1024x768 punti verrà diviso in 1536 mattoncini e ognuno di essi
entra perfettamente nello Z-Buffer interno evitando l'operazione di copia da
questo buffer in quello esterno con un notevole risparmio di banda passante!
2. Nella seconda fase si applicano le texture solo sulle
superfici visibili determinate nella prima fase.
3. Nella terza fase tutti i dati vengono immagazzinati in
un Frame Buffer e poi spediti sul display per essere visualizzati.
L'ultimo pregio da citare riguarda la scalabilità del chip
che offre una facile opportunità di essere connesso in parallelo con altri chip
Kyro II. Questo grazie all'architettura Tile Based Rendering che permette di
lavorare indipendentemente su ogni singolo tassello della scena.
A questo punto le differenze fra le due architetture si fanno
evidenti: mentre nella visione tradizionale tutta l'elaborazione è effettuata
su ogni singolo triangolo senza considerare l'interazione esistente fra questi
oggetti, nella visione Tile Based Rendering si effettuano tutti i calcoli
relativi alla geometria della scena (posizione, colore, ...) e si memorizzano
questi in una lista chiamata Triangle-List. Ogni Tile avrà la sua Triangle-List
sulla quale vanno effettuati i confronti di profondità per determinare i
triangoli visibili e dunque viene considerata la posizione reciproca di ogni
triangolo rispetto all'altro. Chiaramente l'architettura del Kyro II permette di
eseguire tutte le operazioni da fare per ogni pixel in parallelo in modo da
smaltire un tassello in pochi colpi di clock.
Naturalmente bisogna tenere in considerazione anche alcuni
aspetti negativi. E' vero che si risparmiano numerosi accessi in memoria grazie
alla suddivisione della scena ma è pur vero che le Triangle-List vanno
memorizzate da qualche parte! Inoltre questa architettura rende di difficile
realizzazione una unità T&L ottimale che dovrebbe essere ristudiata
appositamente.
Infine c'è da dire che a causa dell'ordinamento dei poligoni
che la scheda deve fare prima di renderizzare la scena, si ha un elevato degrado
delle prestazioni quando il numero di poligoni che compone la scena è molto
elevato. Ma vedremo queste cose all'interno dei test.
|