Genere
ND
Lingua
ND
PEGI
ND
Prezzo
ND
Data di uscita
ND

GeForce 3

Aggiungi alla collezione
Speciale

GeForce 3 svelato - La tecnologia - Seconda parte

Evoluzione o rivoluzione? Dopo aver trattato ampiamente dell'nFiniteFX engine, con le sue unità di Vertex e Pixel Shading, passiamo a discutere delle funzioni di High Resolution Anti Aliasing e del nuovo sistema di gestione della memoria della GPU nVidia che secondo i maggiori sviluppatori cambierà, di nuovo, il mondo della grafica 3D nei giochi.

di Antonino Tumeo, pubblicato il

LA MEMORIA ALLA VELOCITÁ DELLA LUCE

La larghezza di banda della memoria: il problema più ostico che ha impedito ai GeForce di esprimere le loro vere potenzialità. Fin già dal GeForce 256, infatti, la banda di memoria ha rappresentato il collo di bottiglia più grave dell'architettura: per vedere le vere potenzialità di quel chip grafico (che aveva una frequenza di "soli" 120 MHz) si sono dovute attendere le versioni che montassero memorie di tipo DDR (Double Data Rate) al posto delle SDR. Con il GeForce 2 GTS, nVidia ha puntato fin da subito alle memorie DDR, ma memorie inizialmente da soli 166 MHz non riuscivano a supportare in maniera adeguata un core da 200 MHz e limitavano l'aumento delle prestazioni rispetto al precedessore in maniera considerevole (benché l'aumento fosse comunque tangibile). Ricordiamo naturalmente tutti i test che mostravano come aumentando la frequenza della memoria i risultati di tutti i test continuavano a salire (mentre cambiando al frequenza del core gli aumenti erano risibili). Da qui il lancio della versione Pro (con memorie DDR a 200 MHz) e della versione Ultra, dove le prestazioni crescono più che per il chip a velocità maggiore (alla comunque non indifferente frequenza di 250 MHz) per le memorie a 233 MHz (sempre DDR).
Bene, con il GeForce 3 nVidia ha voluto attaccare il problema dalla base.
Possiamo suddividere il problema della larghezza di banda in due aspetti: uno, diventato importante solo ultimamente grazie ai GeForce stessi e alle loro unità di Transformation & Lighting, relativo alla geometria e legato al bus di sistema, e uno più generalizzato relativo al rendering dei pixel stessi e legato al sistema di gestione della memoria della scheda grafica.
Analizziamo prima il problema "geometrico". Grazie alle unità T&L dei GeForce, i programmatori hanno finalmente avuto la possibilità di aumentare la complessità geometrica delle loro scene, generando modelli con tantissimi poligoni. Una scena tipica può arrivare al giorno d'oggi a 100.000 poligoni, e calcolando 3 vertici per poligono, otteniamo ben 300.000 vertici. Se pensiamo che ogni vertice può contenere più di 50 byte di informazioni, arriviamo alla modica cifra di 15 MB di dati geometrici per ogni fotogramma. Per cui, per mantenere una velocità di 60 fotogrammi al secondo, avremmo bisogno di una banda di memoria che ci permetta di trasferire 900 MB al secondo. Non certo pochi, e il GB/s offerto dall'AGP 4X va piuttosto stretto...
La soluzione proposta da nVidia sotto questo punto di vista verte su una delle nuove funzioni introdotta con le DirectX 8.0: si tratta del supporto in hardware per le cosiddette "higher order surfaces" (superfici di ordine superiore). Il triangolo è l'unità fondamentale per costruire i modelli, ma, come è comprensibile, per aumentare il dettaglio o rappresentare superfici curve che appaiano realistiche diventa necessario incrementare sempre più il numero di poligoni utilizzati. Il principio delle higher order surfaces è quello di permettere agli sviluppatori di creare oggetti usando delle "curve" definite da punti di controllo. Una curva o una superficie definita da punti di controllo è chiamata "spline". Utilizzando una spline e pochi punti di controllo, è possibile creare superfici curve piuttosto complesse, e unendo insieme più spline si possono realizzare piuttosto semplicemente oggetti che sarebbero stati difficili da disegnare utilizzando solo i triangoli. Il GeForce 3 supporta queste superfici curve in hardware, che consentono una descrizione più efficiente di geometrie complesse senza dover utilizzare numeri crescenti di triangoli. Descrivendo la superficie con punti di controllo, essa viene definitiva a tutti gli effetti da poche e semplici formule invece che da milioni di dati diversi sui triangoli che la compongono. L'applicativo passa queste poche formule molto velocemente attraverso il bus AGP e poi in hardware il processore grafico stesso si occupa di elaborarle per trasformarle nei triangoli che andranno a rappresentare la superficie nella scena. I risultati sono scene grafiche più dettagliate per le quali però il bus grafico viene sfruttato in maniera molto più efficiente, dunque permettendo di ottenere prestazioni generalmente migliori.
Ancora più sostanzioso, però, è il problema costituito dalla banda di memoria per i Pixel. Le architetture grafiche tradizionali, elaborano i pixel leggendo e scrivendo dallo Z buffer e dai buffer dei colori e accedendo ai dati delle texture. Lo fanno per tutti i pixel sulla scena, indipendentemente dal fatto che siano visibili o coperti da un altro oggetto. Infatti se un pixel di un oggetto viene coperto da un altro, quel pixel viene elaborato due, tre, quattro volte quanti sono gli oggetti che lo coprono. Immaginiamo, ad esempio, una scena dove un personaggio si muove in primo piano. I pixel dello sfondo che il personaggio copre, vengono comunque elaborati anche se non saranno mai visualizzati. Si parla di "depth complessity" (complessità della profondità): in questo caso, molto semplice, siamo ad una depth complessity di 2, ma in una qualsiasi scena 3D dei giochi normalmente utilizzati, si raggiungono depth complessity molto più alte, anche di 4 o di 5 livelli.
Ora, il rendering di un singolo pixel comporta fondamentalmente questi passaggi: la lettura del colore, la lettura dello Z-Buffer per scoprire la profondità di quel pixel, la lettura dei dati delle texture per applicarle sul pixel stesso, e poi eventualmente la scrittura del nuovo colore (combinato con la texture) e del nuovo valore di profondità. Nel caso si utilizzi una risoluzione a 32 bit, ciascuna di queste 5 operazioni richiede 4 byte, per un totale, dunque, di 20 byte per il rendering di ciascun pixel.
Moltiplichiamo, questi 20 byte per la risoluzione standard di 1024x768 (cioè 786.432 pixel per fotogramma): otteniamo quasi 16 MB di dati per ogni singolo frame. Ma, come abbiamo evidenziato, a seconda della depth complessity, ciascun pixel può essere generato anche 2, 3, 4 volte, e naturalmente bisogna moltiplicare il valore ottenuto anche per questo numero. Supponiamo, come fa nVidia nei suoi white papers, una complessità media della scena di 2,5. Otteniamo circa 40 MB per fotogramma, e se vogliamo almeno 60 frames per secondo, ciò significa che la nostra scheda grafica dovrà gestire, solo per i pixel, un flusso di 2,4 GB al secondo. Cambiando la risoluzione e la complessità i numeri aumentano, ma il succo del discorso è questo: con tali numeri è necessario disporre di un controller della memoria, per le operazioni di lettura e scrittura, in grado di trasferire queste enormi moli di dati tra i vari buffer nella maniera più efficiente possibile (che cioè, non sprechi bytes inutilmente, per intenderci), e non sarebbe male se ci fosse un modo per rendere più efficace l'elaborazione delle scene, in quanto evitando di calcolare quei pixel coperti che non saranno mai visualizzati (e quindi riducendo la complessità di ciò che viene disegnato), la banda necessaria diminuirebbe certamente.
nVidia ha adottato delle soluzioni che lavorano su entrambi questi fronti. Infatti, nel GeForce 3 è stato introdotto un controller della memoria completamente rinnovato e sulla carta molto più efficiente. Le memorie utilizzate sono naturalmente sempre quelle di tipo DDR, al momento le uniche che, grazie alla possibilità di eseguire lettura e scrittura sia nella salita che nella discesa del segnale di clock, possono fornire la banda e le velocità necessarie, pur con tutti gli accorgimenti del caso. Aggiungiamo, come nota, che per il GeForce 3 nVidia suggerisce ai costruttori l'utilizzo di ben 64 MB, alle frequenze più alte disponibili (233 MHz, da moltiplicare per 2 proprio per le peculiari caratteristiche di questa memoria), come cioè per le scheda basate sui GeForce 2 Ultra.
Utilizzando questo tipo di memoria, con dei controller da 128 bit (come quelli generalmente utilizzati su tutte le schede video che adottano DDR RAM), significa accedere ad essa in blocchi da 256 bit (poiché in un singolo accesso vengono trasferite il doppio delle informazioni). Benché trasferire blocchi così grossi in un singolo colpo possa sembrare una buona soluzione dal punto di vista quantitativo, dal punto di vista qualitativo sorgono grossi problemi quando le scene sono molto complesse, con centinaia di migliaia di poligoni. Infatti, in queste situazioni, i triangoli possono essere veramente piccoli, anche pochissimi pixel. Immaginiamo un triangolo di 2 pixel, con 32 bit di informazioni (su Z buffer o colore), per ciascuno. Il totale di informazioni è 64 bit. Se facciamo un accesso in blocchi da 256 bit, sprecheremo ben 192 bit per leggere le informazioni di quel triangolo, cioè ben il 75% della banda che abbiamo disponibile e che potrebbe essere utilizzata per accedere altri dati.
Il nuovo Crossbar Memory Controller di nVidia cerca di risolvere in maniera radicale questo problema. Il nuovo controller, che è sempre in grado di accedere a blocchi di informazioni di 256 bit in un singolo ciclo di clock, può però farlo con un'alta "granularità", fino a blocchi di soli 64 bit. Ciò significa che, in uno stesso ciclo di clock possono, ad esempio, essere letti quattro blocchi diversi da 64 bit di informazioni, rendendo ogni accesso altamente efficiente. Si evita così che frazioni della banda di memoria vadano sprecate inutilmente, e si fa in modo che il bus tra chip grafico e memoria sia sempre sfruttato al massimo. Questo risultato è stato ottenuto implementando praticamente quattro controller di memoria indipendenti in grado di comunicare tra loro e con la GPU. Questo sistema si bilancia continuamente in modo da mantenere il flusso di informazioni sempre costante e sfruttando al meglio la banda disponibile, tanto che nVidia promette un efficienza fino a 4 volte superiore rispetto alle soluzioni vecchie in situazioni di altissimo carico.
Ma banda disponibile gestita in maniera più efficiente non significa comunque ridurre la mole di informazioni che deve essere trasferita, e ad un certo punto si arriva sempre al limite. Per aumentare ulteriormente le prestazioni, bisogna trovare un modo per diminuire, dove possibile, i dati che devono essere continuamente passati da memoria a chip grafico. Chiaramente non si possono eliminare tutti i dati, ma, come abbiamo visto, si può agire sulla depth complessity, cioè su quei pixel che non vengono visualizzati, o, più in generale, sul sistema di Z-Buffer.
Lo Z-Buffer è quell'area di memoria dove vengono memorizzate le profondità dei pixel che devono essere visualizzati (dunque le loro caratteristiche di visibilità). Questi dati vengono letti e generalmente anche scritti per ogni pixel che viene elaborato, e dunque come si può immaginare la parte di banda di memoria necessaria a far transitare questi "accessi" è molto sostanziosa. E su questi dati si può lavorare, per ottimizzare le prestazioni. ATi è stata la prima ad accorgersene, introducendo, se ricordate, la tecnologia HyperZ sui suoi RADEON, che si occupa di comprimere questi dati e di impedire alla scheda grafica di passare alla fase di rendering dei pixel non visualizzati. nVidia si è adeguata e ha inserito nel GeForce 3 il supporto per la Loseless Z Compression. Questa tecnologia è in grado di comprimere i dati dello Z Buffer in un rapporto di 4 a 1 in real time, e la compressione/decompressione è gestita interamente in hardware. In questa maniera il traffico generato per lo Z Buffer si riduce ad un quarto e aumenta la banda disponibile per gli altri dati.
Con la sigla Z Occlusion Culling nVidia indica invece la tecnologia che si occupa di non far elaborare al chip grafico i pixel "nascosti" (o, per l'appunto, "occlusi" da altri pixel di oggetti che nella scena 3D appaiono davanti), che finirebbero quindi solo per sprecare banda di memoria. Si tratta del corrispettivo dello Hierarchical Z di ATi (che è sempre una parte dell'architettura HyperZ) e della HSR (Hidden Surface Removal, che 3dfx stava introducendo nei Voodoo 5 prima dell'acquisizione da parte di nVidia stessa). Il GeForce 3 è in grado di determinare, prima di passare in fase di rendering, se un pixel risulterà visibile o no, analizzando i dati nello Z Buffer. Se l'unità di Z Occlusion Culling determina che non sarà visibile, il pixel non sarà elaborato, il frame buffer non verrà occupato e la corrispettiva banda di memoria non verrà utilizzata. A seconda della complessità della scena, i benefici possono essere grandi: naturalmente, più è complessa la scena, più l'efficienza sale nei confronti di una scheda identica ma senza il supporto per questa funzionalità, perché maggiore è la banda di memoria risparmiata. In più, strettamente collegata alla Z Occlusion Culling, il GeForce 3 offre una tecnologia denominata Occlusion Query, grazie alla quale gli sviluppatori possono sviluppare applicazioni in grado di chiedere al chip grafico di gestire delle regioni sulle quali fare i test di visibilità. Se la GPU determina che tali regioni non dovessero essere visualizzate, allora tutti i calcoli relativi alla geometria e al rendering possono venire saltati: ad esempio, lo scenario fuori da un tunnel, i personaggi nelle altre stanze... L'aumento prestazionale sarebbe notevole.
Ma dal punto di vista pratico, dunque, quali vantaggi apportano tutte queste tecnologie? Diciamo che in linea teorica, grazie ad esse dovremmo avere prestazioni superiori ai GeForce 2 Ultra, anche se non di moltissimo. Naturalmente, i benefici maggiori si vedranno alle risoluzioni più alte: di certo non vedremo grosse differenze a 16 bit e a 640x480 o a 800x600. Salendo di risoluzione, però, visto che come abbiamo discusso prima crescono esponenzialmente le richieste di banda di memoria, tutte queste tecniche permetteranno di avere vantaggi percentualmente sempre maggiori sulle prestazioni dei chip precedenti, anche con giochi non in grado di sfruttare l'nFiniteFX engine. Un po' come avviene con i Radeon, in grado di distinguersi rispetto al GeForce 2 alle risoluzioni più alte grazie all'HyperZ.