Članki » Grafične tehnologije » Kaloričen zajtrk: milijarde trikotnikov in sodobni GPU-ji
Kaloričen zajtrk: milijarde trikotnikov in sodobni GPU-ji
- Marko Dolenc ::
Spletni forumi so dandanes polni razglabljanj na temo poÄasnega napredovanja grafike v PC igrah. VeÄina komentatorjev se obiÄajno obdregne ob konzole, katerih zmogljivosti so fiksirane že vse od njihovega izida in poslediÄno viÅ¡jih stroÅ¡kov razvoja iger, v primeru dodatnih grafiÄnih izboljÅ¡av za PC razliÄico. To sicer v precejÅ¡nji meri drži, na žalost pa to ni celotna zgodba.
Pred Å¡tirimi leti je NVIDIA izdala GeForce 8800 GTX, ki ga je pogajalo 128 stream procesorjev, AMD pa je nekoliko kasneje sledil z grafiÄno kartico Radeon 2900 XT, na kateri je tiktakalo kar 320 SP-jev. Že ti dve kartici sta po zmogljivostih osramotili tako PS3, ki ga poganja modificirana razliÄica GeForce 7800 GTX, kot tudi XBox 360, kjer prebiva nekakÅ¡en hibrid med Radeon 2900XT in starejÅ¡im Radeon X1800. Skratka, že v trenutku, ko je na trg priÅ¡el Sony PS3, sta bili obe konzoli strojno za najzmoglivejÅ¡imi grafiÄnimi karticami, ki so bile na razpolago PC uporabnikom. Danes se v najzmoglivejÅ¡ih GeForce-ih bohoti 512 SP-jev, Radeon-i pa so v tem Äasu priÅ¡li do celih 1536 SP-jev. IzboljÅ¡av so bile deležne tudi vse ostale komponente, ki jih najdemo v sodobnih GPU-jih. VeÄja propustnost do pomnilnika, veÄ enot za teksturiranje in izris,...
Padla je celo zadnja serijska ovira v grafiÄnem cevovodu: rasterizacija trikotnikov. Tako GeForce GPU-ji, osnovani na Fermi arhitekturi (seriji 400 in 500), kot tudi Radeon-i iz serije HD 6900, zmorejo soÄasno rasterizirati veÄ kot en trikotnik v urinem ciklu, kot je bilo to v navadi pri prejÅ¡njih generacijah grafiÄnih posepeÅ¡evalnikov. Vsaj v teoriji bi to moralo omogoÄati drastiÄen dvig kvalitete slike v igrah...
Najprej nekaj osnov
GrafiÄne knjižnice kot sta Direct3D in OpenGL predpiÅ¡ejo celoten cevovod in proces nastanka slike, Äemur obiÄajno reÄemo grafiÄni cevovod. Knjižnica vsebuje cel nabor ukazov, ki konfigurirajo pipeline, omogoÄajo kreiranje tekstur in ostalih objektov, pripenjanje tekstur željeni programabilni stopnji (recimo pixel shader), nastavljanje filtriranja tekstur, nastavljanje vseh mogoÄih shaderjev,... Potem je tu Å¡e serija ukazov DrawPrimitive, ki poÅ¡ljejo GPU-ju ukaz za izris trikotnikov, ali ostalih primitivov, s trenutno aktivno konfiguracijo cevovoda. Za vsak objekt, ki ga nameravamo izrisati, je najprej potrebno nastaviti cevovod in izdati ukaz DrawPrimitive za izris trikotnikov. Vsak tak ukaz lahko izriÅ¡e od enega do veÄ milijonov trikotnikov in kot bomo videli v nadaljevanju: veÄ je bolje.
Kako lahko izboljÅ¡amo grafiÄno podobo v igrah? Ena možnost je z uporabo vedno bolj detajlnih objektov, kar je obiÄajno izbrana pot. V igrah zato sreÄujemo vedno kompleksnejÅ¡e shader programe, ki senÄijo pike kar se le da blizu naÅ¡im izkuÅ¡enjam iz realnosti. Druga možnost je poveÄanje Å¡tevila posameznih in unikatnih objektov. Poglejmo igro nekoliko starejÅ¡ega datuma Half Life 2:
Koliko med seboj neodvisnih objektov lahko razloÄimo na sliki? Za izris te slike je bilo izvedenih 6112 klicev Direct3D 9 knjižnice, 545 od teh je bilo ukazov za izris. VeÄino klicev torej opravimo za konfiguracijo grafiÄnega cevovoda, veÄino magije pa se zgodi v zgolj 545 DrawPrimitive klicih, ki sprožijo delo na GPU-ju. Pogon, ki se skriva za Half Life 2, je že od izida veljal za "optimiziranega", saj je že na takratni strojni opremi tekel zelo zadvoljivo in brez zatikanj. Obenem je z nekaj pametnimi prijemi tudi izgledal fenomenalno za svoj Äas. Sliko zgoraj sestavlja toÄno 107002 trikotnikov in s posameznim ukazom se izriÅ¡e najveÄ 5944 trikotnikov.
Å e primer kako tak posamezen DrawPrimitive ukaz dejansko izgleda:
Kvadratek nad "Pre-Vertex Shader" prikazuje sliko vojaÄka v svoji "naravni" pozi, tako kot so ga razvijalci torej zapekli na medij. "Post-Vertex Shader" je slika geometrije vojaÄka po tistem, ko ga vertex shader animira (vidimo naprimer premaknjene roke in noge) in prestavi v željen prostor. Desni kvadratek "Viewport" prikazuje naÅ¡ lik na celotnem zaslonu. Tabela na spodnjem delu slike pa so dejanski vhodni podatki za GPU.
Poglejmo še nekaj bolj kompliciranega, recimo Crysis z ultra nastavitvami, ki še vedno velja za eno zahtevnejših iger za PC:
Za to sliko je igra poslala 31507 ukazov Äez Direct3D 10 knjižnico od tega 3942 DrawPrimitive klicev. Ta Å¡tevilka v nekaterih primerih Å¡e precej naraste in jo torej vzemimo za neko srednjo vrednost. Crysis je bil ob izidu nedvomno tehniÄno najbolj dovrÅ¡ena igra na svetu. Å e danes, Å¡tiri leta po izidu, ne izgleda zasterelo in zmore resno zaposliti tudi sodobne igriÄarske osebne raÄunalnike. Zaradi tega se ga je prijel sloves "slabo optimizirane" igre. Zgornja slika je sestavljena iz 5815972 trikotnikov, posamezen DrawPrimitive klic pa izriÅ¡e tudi do 97508 trikotnikov naenkrat.
ÄŒas za nekaj opažanj trendov napredka. Half Life 2 je izÅ¡el leta 2004 in Crysis leta 2007, torej 3 leta kasneje. ÄŒe se omejimo na ti dve igri se je v treh letih Å¡tevilo loÄenih objektov, ki sestavljajo celotno sliko, poveÄalo za faktor 7. V istem Äasu se je koliÄina trikotnikov na teh dveh slikah poveÄala za faktor 54! Torej konkreten primer razvoja, kjer bistveno hitreje izboljÅ¡ujemo izgled posameznih objektov, kot dodajamo nove. ÄŒe si privoÅ¡Äimo nekoliko neumno projekcijo (ker Half Life 2 ni bil tehniÄno zahtevna igra svojega Äasa, za razliko od Crysis) na danaÅ¡nje dni, si torej lahko danes privoÅ¡Äimo 300 milijonov trikotnikov na sliko, kar je popolen nesmisel, saj imamo na najveÄjih 30" zaslonih komaj 4 milijone pik (75 trikotnikov za pixel? Å e filmarji ne poÄnejo tega). Na žalost si v igri niti ne moremo privoÅ¡Äiti 28000 loÄenih objektov.
PraktiÄne omejitve
Vzemimo za zaÄetek krono AMD-jeve grafiÄne ponudbe: Radeon 6970, ki tiktaka pri 880MHz in zmore vsak cikel rasterizirati dva trikotnika. V teoriji nas to pripelje do 1,76 milijarde trikotnikov na sekundo. Njegov predhodnik Radeon 5870 je zmogel manj kot polovico tega. NVIDIA je zastavila svoj Äip Å¡e bolj optimistiÄno, saj zmore vsak cikel izrisati 4 trikotnike kar najmoÄnejÅ¡o razliÄico GeForce 580 GTX postavi na neverjetnih 3,088 milijard izrisanih trikotnikov na sekundo. Da postavimo to Å¡tevilko v nekakÅ¡en okvir: Radeon 9700 PRO, ki je bila prva resna DirectX 9 grafiÄna kartica iz leta 2002, je zmogel izrisati 2,6 milijard pik! Torej si lahko danes privoÅ¡Äimo veÄ trikotnikov na ekranu, kot smo si lahko pred desetimi leti privoÅ¡Äili pik!
Te Å¡tevilke so seveda teoretiÄni maksimumi. Nekaj veÄ znanja nam te Å¡tevilke že tudi v teoriji lepo oklesti. Prvo dejstvo, ki ga moramo upoÅ¡tevati je, da morajo izrisani trikotniki nujno zasedati zelo malo pik po rasterizaciji oziroma na zaslonu. ÄŒe imamo opravka s 100 pik velikimi trikotniki ne moremo niti upati na dosego 3 milijard trikotnikov v sekundi, saj noben grafiÄni Äip ni sposoben izrisati 300 milijard pik v sekundi. Ob tem pa nastane težava, da vsi GPU-ji izrisujejo pike v 2x2 pik velikih blokih. ÄŒe riÅ¡emo zelo majhne trikotnike bo vedno lep del pik v teh blokih ostal nedotaknjen. Å e veÄja težava je, ker shaderji senÄijo pike v Å¡e veÄjih blokih. Tako majhni trikotniki torej ne izrabijo zmogljivosti GPU-ja tako uÄinkovito, ampak se nima smisla preveÄ ubadat s tem, saj se zmogljivosti GPU-jev poveÄujejo izredno hitro. V praksi lahko te Å¡tevilke tako na GeForce-ih kot Radeon-ih dosežemo samo z nevidno geometrijo (Torej geometrija, za katero se po transformacij izkaže, da ni na zaslonu, ali pa je skrita nekje globoko v ozadju).
Obstaja pa Å¡e nekaj bolj politiÄnih omejitev, ki se tiÄejo GeForce kartic. Prva omejitev je namenjena povsem diferenciaciji profesionalne serije grafiÄnih kartic: Serija GeForce, ki je namenjena igralcem iger, ima za normalno geometrijo omejeno rasterizacijo na 1 trikotnik na urin cikel (profesionale kartice iz Quadro serije nimajo te omejitve). ÄŒe hoÄemo iztisniti maksimum, potem je potrebno uporabiti teselacijo, saj v tem primeru ta omejitev ne velja.
Naslednja omejitev je odloÄitev ekipe odgovorne za gonilnike, da se na GeForce-ih del geometrije (index bufferji) hrani v sistemskem pomnilniku. To zadane Direct3D knjižnico, ki je danes praktiÄno edina izbira za igre, in omeji doseganje teoretiÄnih maksimumov s propustnostjo PCI Express vodila, ki ni sposobno dostaviti dovolj podatkov GPU-ju dovolj hitro. ReÅ¡itev je tudi v tem primeru teselacija, ki zmanjÅ¡a tako potrebe po spominskem prostoru kot pomnilniÅ¡ki propustnosti.
Na naÅ¡o žalost, so to zopet vse zgolj teoretiÄne omejitve, ki omejujejo zgolj doseganje Å¡tevilk, ki jih proizvajalci tiskajo na Å¡katle. Igre zadanejo v Å¡e zabavneÅ¡je težave, o katerih verjetno Å¡e niste sliÅ¡ali nikjer niÄ razen, Äe se ukvarjate s samim razvojem raÄunalniÅ¡kih iger.
Testni scenarij
Koliko razliÄnih objektov si torej lahko privoÅ¡Äimo soÄasno na sliki v igri? Oziroma: Koliko DrawPrimitive ukazov lahko Å¡e poÅ¡ljemo na GPU, da bo igra Å¡e vedno tekla tekoÄe? Postavimo enostaven scenarij: renderirajmo kvadrat sestavljen iz veÄ tisoÄ tirkotnikov, ki ga najprej izriÅ¡emo v enem kosu in nato postopoma razbijemo na 100000 individualnih delov oziroma medsabo povsem neodvisnih ukazov za izris. Vsak posamezen del lahko poljubno premikamo, zamenjujemo teksture, senÄilne programe,... Skratka vsak del je povsem neodvisen objekt, kot jih najdemo v igrah. Zaradi Äistosti situacije se tudi omejimo na najenostavnejÅ¡o možno situacijo: vsi objekti bodo izrisani z istimi shaderji in isto 64x64 tekslov veliko teksturo. Edina sprememba med posameznimi objekti bo torej drug izvor ogljiÅ¡Ä in indeksov, ki definirajo trikotnike, ter drugaÄne konstante, ker vsak objekt postavimo na svojo individualno lokacijo v 3D prostoru.
ZaÄnimo enostavno s 500000 trikotniki, DirectX 9 knjižnico in nekaj razliÄne strojne opreme:
Vertikalna os oznaÄuje milisekunde, ki jih potrebujemo za izris posamezne sliÄice, horizontalna pa Å¡tevilo poslanih DrawPrimitive ukazov. Za orientacijo, 33 milisekund na sliko pomeni dobrih 30 slik na sekundo, 16 milisekund pa okrog 60 slik na sekundo. Kot vidimo Äasi renderiranja, s poveÄevanjem Å¡tevila objektov, zelo hitro naraÅ¡Äajo kljub temu, da je na zaslonu ves Äas enako Å¡tevilo trikotnikov in izrisanih slikovnih toÄk. GeForce 7600 GS teÄe na procesorju Athlon XP 2800+, ki je danes že kar precej v letih, grafiÄna kartica pa sploh nikoli ni bila kakÅ¡na Å¡pica razvoja. Radeon 6950 in GeForce GTX 580 sta tekla na Å¡tirijedrnem Q9550. ÄŒe pogledamo surove podatke je na Athlonu meja za 60 sliÄic na sekundo pri 4300 DrawPrimitive klicih. Radeon 6950 na Q9550 Å¡e doseže 60 sliÄic na sekundo pri 8200 izrisih in GTX 580 vse do 12500 klicev.
Zgoraj sem omenjal, da Crysis poÅ¡lje nekaj manj kot 4000 ukazov za izris, kaj je torej moja poanta, Äe že Q9550 zmore vsaj 2x toliko klicev? Trik je v tem, da pri tem testu CPU ne poÄne niÄesar drugega kot samo poÅ¡ilja vedno nove DrawPrimitive klice na GPU. Ne preraÄunava nobene fizike, umetne inteligence ali Äesa podobnega. Tudi glede samih klicev Äez Direct3D knjižnico je ta test bistveno bolj prizanesljiv kot igre. kljub temu pa CPU ni sposoben dostavljati DrawPrimitive ukazov dovolj hitro, da bi GPU ostal povsem zaposlen za kaj veÄ kot zgolj trivialno Å¡tevilo ukazov za izris. ÄŒe skalo obrnemo in izriÅ¡emo graf izrisanih trikotnikov v sekundi postane celoten problem boleÄe oÄiten. Pozor! Skala je tokrat logaritmiÄna, torej je strmoglavljenje dejansko Å¡e hujÅ¡e:
ÄŒe celoten kvadrat izriÅ¡emo s samo enim ukazom bo GeForce 7600 GS dosegel 85 milijonov trikotnikov na sekundo. Radeon 6950 se dobesedno izstreli do 700 milijonov, GTX 580 pa obvisi malo pod 400 milijonov trikotnikov na sekundo. Å tevilke so precej stran od teoretiÄnih maksimumov, ampak ker tako Radeon 6950 kot GTX 580 divjata s skoraj 1000 sliÄicami na sekundo, je hitro jasno, da se ne ena ne druga kartica ne potita prav zelo. ÄŒe pogledamo kaj se zgodi pri okrog 3900 DrawPrimitive klicih, kolikor jih naredi Crysis, pa nastopi Äas za poletno mrzlico. GeForce 7600 GS pade približno za polovico in pristane pri 34 milijonih trikotnikov na sekundo, Radeon 6950 dobesedno strmoglavi za faktor 10 na zgolj 70 milijonov trikotnikov na sekundo, GeForce GTX 580 pa obrži nekaj Äasti in strmoglavi "samo" za faktor 4 na malo pod 100 milijonov trikotnikov na sekundo. Intel Q9550 in Radeon 6950 samo 2x hitrejÅ¡i od Athlon XP 2800+ in GeForce 7600GS? Super Pi za milijon decimalk na prvem porabi 17 sekund, na drugem pa 56 sekund, torej ne?
Pri 500000 trikotnikih na sliko se torej niti ena od treh grafiÄnih kartic ne spoti. Da so izkoristili izboljÅ¡ave novih grafiÄnih kartic so razvijalci Å¡li v vedno veÄje detajle objektov. Shaderji so postali kompleksnejÅ¡i, Å¡tevilo trikotnikov se je poveÄalo, Å¡tevilo objektov pa ostaja približno enako. Ponovimo isto vajo Å¡e mi. Iz 500 tisoÄ trikotnikov pojdimo na 16 milijov trikotnikov, kar je precej veÄ kot jih izriÅ¡e celo Crysis in verjetno veÄ kot vse igre, razen tistih, ki uporabljajo teselacijo.
Tokrat se GeForce GTX 580 že pokaže v svoji pravi luÄi. 16 milijonov trikotnikov na sliki brez teselacije in teÄe na svojem maksimumu 440 milijonov trikotnikov vse do okrog 12700 izrisov, ko ga poÄasi zaÄne preostanek sistema vleÄi nazaj. Za izris porabi okrog 40 milisekund torej je Å¡e pri komaj zadovoljivih 25 sliÄicah na sekundo. Na konÄnih 100 tisoÄ klicih pa med obema scenarijoma že ni nobene razlike veÄ.
IzkoriÅ¡Äenost GPU-ja Äez celoten obseg je v tem primeru tudi nekaj boljÅ¡a.
DirectX 10 in 11 nas bosta rešila!
Na spletnih forumih se pogosto ponavljam kot kakÅ¡na stara lajna s stavki v smislu: "Direct3D 10/11 je super in fajn, ker je bolj Äista knjižnica in obenem Å¡e hitrejÅ¡a od Direct3D 9." Direct3D 10 in 11 sta torej programersko lepa, brez vse nepotrebne navlake, ki se je nabrala skozi 15 let obstoja knjižnice, vendar nam to pri performanÄnih problemih ne pomaga. Direct3D 11 omogoÄa programerjem, da zgradijo ukazno sekvenco za GPU v veÄih nitih in tako bolje izkoristijo moderne veÄ jedrne centralne procesorje. Direct3D 10 in 11 tudi omogoÄata programerjem, da z enim klicem knjižnice nastavijo recimo celoten nabor tekstur za pixel shader, ali vse konstante za vertex shader,... Posamezno je to malenkostna optimizacija, Äez 10000 ponovitev pa se razlike lahko že lepo seÅ¡tejejo. Direct3D 9 ne zmore nastavljati vsega v takih blokih.
Obdržimo rezultate GTX 580 za 16 milijonov trikotnikov in si poglejmo kako se obnese Direct3D 11 v single threaded okolju:
Direct3D 11 brez multi threadinga v naÅ¡em primeru ne prinese kakÅ¡ne obÄutne prednosti. Na zaÄetnem delu grafa, ki je za praktiÄne rezultate v igrah najpomembnejÅ¡i je sicer malenkost hitrejÅ¡i od Direct3D 9, kasneje pa celo nekaj poÄasnejÅ¡i. Skratka niÄ kar bi nas prav zelo spodbudilo. Situacija v igrah je sicer nekoliko drugaÄna, ker igre porabijo nekoliko veÄ Äasa za konfiguracijo grafiÄnega cevovoda in se zaÄnejo nalagati zgoraj omenjene prednosti glede zmanjÅ¡evanja Å¡tevila klicev Äez knjižnico.
Pogled po propustnosti je tudi brez preseneÄenj. Radeon 6950 tukaj pokaže vse svoje zobe in pri 1,4 milijarde trikotnikov na sekundo pride spodobno blizu svoji teoretiÄni meji 1,6 milijarde trikotnikov na sekundo. GeForce GTX 580 je v tem primeru omejen s hitrostjo PCI Express vodila in ne more zlezti niti do svojih 772 milijonov, na kolikor je omejen (450 milijonov trikotnikov * 3 indeksi na trikotnik * 4 bajti za index = 5,4 GB/s prometa Äez PCI-Express. Do polnih 8GB/s mora ostati Å¡e nekaj prostora za sam ukazni tok za GPU). V sploÅ¡nem se razlika med GeForce in Radeon grafiÄnima karticama pokaže v odvisnosti od Å¡tevila trikotnikov na sliki. ÄŒe ima Radeon možnost napeti svoje miÅ¡ice, ker je na sceni dovolj veliko trikotnikov in dovolj malo DrawPrimitive klicev, potem bo v vodstvu. Sicer ga bo GeForce prehitel, Äim je v igri dovolj ukazov za izris.
Kot že omenjeno Direct3D 11 nudi izboljÅ¡ave glede izkoriÅ¡Äanja multithreadinga:
AMD-jevi gonilniki Å¡e vedno ne podpirajo multithreadinga, kljub temu pridobimo nekaj na hitrosti. NVIDIA od gonilnikov serije 270 naprej podpira multithreading in pridobitve se gibljejo konsistentno okrog 30%, Äim pridemo izven omejitve vodila PCI Express. Na žalost trenutno veÄ Direct3D kontekstov uporablja le Civilization V, kar pove precej o stanju razvoja iger za PC, Äe strategija vozi po tehnoloÅ¡kem robu. Za Battlefield 3 se tudi obljublja precejÅ¡nja uporaba tega mehanizma.
DirectX 11 torej nekoliko izboljÅ¡a situacijo, ki na žalost Å¡e vedno ostaja daleÄ od rožnate. VeÄina bralcev bi ob uporabi vseh Å¡tirih jeder CPU-ja stavila na precej veÄje pohitritve. Obenem Å¡e vedno nismo niti blizu situaciji, ko bi si v igri lahko privoÅ¡Äili npr. prodnato plažo z 99000 individualnimi kamenÄki, od katerih bi lahko vsakega posebej zaluÄali v morje.
Dva koraka nazaj in korak v levo
Kaj je torej razlog, da si v igrah ne moremo privoÅ¡Äiti bistveno veÄjega Å¡tevila objektov in zakaj so razvijalci omejeni v tako skromen nabor objektov? GrafiÄne kartice letijo precej viÅ¡je z majhnim Å¡tevilom ukazov kot z velikim, Äeprav je vsebina na sceni v obeh primerih ista. Å tirijedrni Q9550 je tudi veÄ kot 2x hitrejÅ¡i od starega Athlona XP 2800+. Po istem razmisleku bi se morala veÄnitna razliÄica bistveno odlepiti od povsem serijske variante, saj ima na razpolago 4x veÄ raÄunske moÄi na centralnem procesorju.
Vzroki tiÄijo v sami zasnovi Direct3D in tudi OpenGL, oziroma njuni abstrakciji. Najpogosteje menjavamo tri vrste vhodnih podatkov: tabelo ogljiÅ¡Ä (vertex buffer), tabelo indeksov, ki definirajo trikotnike (index buffer) in shader konstante, ki kontrolirajo shaderje. Ti trije podatki se tipiÄno spremenijo pred Äisto vsakim klicem za izris. ÄŒe že ne vsi trije pa vsaj eden. Menjave tekstur so naprimer dosti manj pogoste. Shaderji in ostala stanja pa se spreminjajo Å¡e redkeje. Težava leži v temu, da so vsi ti trije tipi tabel Direct3D objekti in do njih dostopamo s kazalci na ta specifiÄen objekt. Ko igra sporoÄi Äez Direct3D, da hoÄe cevovodu nastaviti vertex buffer A in index buffer B, mora grafiÄni gonilnik v ozadju najprej ugotoviti preslikavo med objektom A in dejanskim naslovom v GPU naslovnem prostoru ter ponoviti isto zgodbo Å¡e za objekt B. To predstavlja problem, gonilnik mora dejansko prebrati A in iz njega pobrati strojni naslov, kjer se A dejansko nahaja. Ker pa A ni v uporabi prav pogosto, obiÄajno enkrat ali dvakrat za izris celotne slike, ta korak obiÄajno pomeni zgreÅ¡itev v predpomnilniku CPU-ja in Äakanje na pomnilniÅ¡ki del, da dostavi podatek, kar lahko traja veÄ 100 urinih ciklov. ÄŒe renderiramo zelo veliko razliÄnih objektov postanemo dejansko odvisni od hitrosti sistemskega pomnilnika. In niti ne njegove prepustnosti, ki se stalno poveÄuje, ampak od Äakalne dobe, da se RAM dejansko odzove na zahtevo in dostavi željen podatek CPU-ju.
ReÅ¡itve znotraj Direct3D trenutno dejansko ni. Multithreading nekoliko omili problem, a reÅ¡iti ga ne more. Glede OpenGL imajo pa proizvajalci strojne opreme precej bolj proste roke. NVIDIA je leta 2009 predstavila tako imenovane "bindless" razÅ¡iritve. Ta funkcionalnost omogoÄa, da OpenGL aplikacija pride do direktnega naslova (kazalca), kjer se kateri od treh omenjenih objektov nahaja. Gre za 64 bitov velik kazalec, ki je veljaven v GPU naslovnem prostoru in toÄno pove, kje naj Äip dobi podatke. Namesto da podamo "ime" objekta, podamo OpenGL-u direkten naslov in gonilnik ga lahko brez težav in takoj poÅ¡lje GPU-ju v obdelavo. Na žalost je ta razÅ¡iritev trenutno na voljo samo za GeForce grafiÄne kartice serije 8 in kasnejÅ¡e.
Sedaj GeForce GTX 580 resniÄno poleti. Isti scenarij kot v Direct3D, 16 milijonov trikotnikov in upoÄasnitev se zaÄuti Å¡ele pri 43000 objektih, brez uporabe multithreadinga! 100 tisoÄ objektov Å¡e vedno lahko izriÅ¡emo pri 25 sliÄicah na sekundo, zagotovo pa bi pridobili Å¡e kar lep procent, Äe bi uporabili veÄ niti.
Tudi glede Å¡tevila renderiranih trikotnikov na sekundo se v tem primeru GTX 580 obnese bistveno bolje. Direct3D in OpenGL gonilnika uporabljata razliÄna pravila za postavitev objektov. V primeru OpenGL vse ostane na grafiÄni kartici. ÄŒeprav je GeForce sicer omejen na 1 trikotnik na cikel in tiktaka pri 772MHz v tej situaciji Å¡e vedno zmore obdelati veÄ kot milijardo trikotnikov na sekundo. Trikotniki so namreÄ tako gosto posejani, da je dosti tudi takih, ki ne zadanejo niti ene pike in so torej nevidni (in grafiÄne kartice imajo takÅ¡ne najrajÅ¡i).
Kaj vzeti domov?
Microsoft bo definitivno moral zavihati rokave in v prihodnji razliÄici Direct3D implementirati nek podoben mehanizem kot so "bindless" razÅ¡iritve za OpenGL. Doseganje teoretiÄnih meja sodobnih GPU-jev je komplicirano, razen v primeru, ko se razvijalci odloÄijo uporabit teselacijo in jo obenem Å¡e navijejo do konca. Radeon-i so precej obÄutljivi glede Å¡tevila DrawPrimitive ukazov, ki jih prejmejo in glede na konkurenco precej hitro izgubljajo performanse. GeForce-i so omejeni, kot da bi se pri NVIDI bali, da bo grafiÄna komu roko odgriznila, Äe je ne privežejo k tlom. Igre danes opravijo od nekaj tisoÄ do 10000 izrisov in ob opravijo precej veÄ konfiguracije kot testen program, kar Å¡tevilke iz naÅ¡ih grafov Å¡e dodatno zniža. ÄŒe je igra enostavna, bo DrawPrimitive klicev manj in GPU bo tako ali tako udaril v svoje druge omejitve, recimo hitrost izvajanja shaderjev (ki so vedno bolj zapleteni), in bo dejansko omejena s strani GPU. ÄŒe se bo igra zakomplicirala in bo Å¡tevilo objektov zaÄelo udarjati ob Å¡tevilko 10000 ali Äez pa omejujoÄ faktor postane sposobnost hitre obdelave DrawPrimitive ukazov s strani grafiÄnega gonilnika, CPU-ja ter sistemskega pomnilnika. V tem primeru Å¡e tako hitra grafiÄna kartica ne pomaga, saj ukazov enostavno ne dobi dovolj hitro.

Čudežno popotovanje skozi grafični cevovod
- Marko Dolenc ::
Trenutno očitno živimo v obdobju, ko razni *PU-ji (Processing Unit) rastejo kot gobe po dežju. Nedolgo tega je tržne police ugledal prvi pospeševalnik fizikalnih izračunov (PPU ali Physic Processing Unit) PhysX podjetja Ageia. In ker to očitno še vedno ni dovolj, ...

Čudežno popotovanje skozi grafični cevovod II
- Marko Dolenc ::
V prvem delu smo si ogledali strukturo sodobne grafične kartice. Med drugim smo omenili shaderje, ki so zaradi svoje programabilnosti, nekakšno srce in duša sodobnih GPU-jev. Različni shaderji so odgovorni za različne strukture v grafiki (v Direct3D 10 so to oglišča, ...

DirectX 9.0 - Osnove programiranja
- Marko Dolenc ::
V prejšnjih dveh člankih smo si ogledali vse novosti, ki jih je Microsoft uvedel v DirectX. Ker verjamem, da mnogi med vami niso ravno programerji, vas pa vseeno zanima, kako izgleda življenje na drugi strani, sem se odločil, da vam to vsaj malo približam. V tem članku bo ...

Nova bitka v vojni grafičnih kartic
- Marko Dolenc ::
Da je računalništvo hitro se razvijajoča panoga čivkajo že vrabčki na vejah. Da se grafične kartice razvijajo še hitreje od ostalih področij znotraj računalništva, je takisto lahko jasno vsakemu, ki vsaj vsake toliko preleti kakšen cenik ...

ATI Radeon 9700 - Nov kralj v grafični deželi
- Marko Dolenc ::
Če ne živite ravno v kakšnem zakotnem pragozdu ter lahko berete ta članek, potem ste gotovo že slišali, da je ATi izdal nov grafični čip R300, ki so ga poimenovali Radeon 9700. Kot verjetno že veste, novi Radeon s precejšjno lahkoto pomete z vso konkurenco ...













