» »

Kaloričen zajtrk: milijarde trikotnikov in sodobni GPU-ji

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:


Sveta enostavnost 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:


Za vajo poiščite vojačka na zgornji sliki


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:


Kriza


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.


Juha trikotnikov


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

Čudežno popotovanje skozi grafični cevovod

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, ...

Preberi cel članek »

Čudežno popotovanje skozi grafični cevovod II

Čudežno popotovanje skozi grafični cevovod II

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, ...

Preberi cel članek »

DirectX 9.0 - Osnove programiranja

DirectX 9.0 - Osnove programiranja

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 ...

Preberi cel članek »

Nova bitka v vojni grafičnih kartic

Nova bitka v vojni grafičnih kartic

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 ...

Preberi cel članek »

ATI Radeon 9700 - Nov kralj v grafični deželi

ATI Radeon 9700 - Nov kralj v grafični deželi

Č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 ...

Preberi cel članek »