Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

Grafická pipeline: jak se vytváří obraz

18.2.2015, Pavel Šantrůček, článek
Grafická pipeline: jak se vytváří obraz
Dnes se podíváme na grafickou pipeline tak, aby souvislosti byly co nejvíce srozumitelné i pro čtenáře, kteří se o tuto problematiku dosud nezajímali. Půjde o předzvěst dalších článků o grafických kartách včetně recenzí zajímavých modelů.
Kapitoly článku:
  1. Grafická pipeline: jak se vytváří obraz
  2. Fáze Draw
  3. DirectX
Nad problematikou grafické pipeline se budeme kvůli zjednodušení vznášet tak vysoko, že se nám některé detaily ztratí z dohledu úplně. Cílem je především populárnější formou seznámit zvídavé čtenáře s tím, jak fungují počítačové hry, grafická pipeline a samozřejmě i samotná grafická karta.

Další důvod pro přečtení tohoto článku je ten, že u dalších plánovaných článků s podobnou tématikou, třeba o grafických kartách a jejich měření, nebo o vadách plynulosti pohybu v počítačových hrách, bude počítáno s tím, že jste tento článek četli a máte tedy alespoň minimální přehled o této problematice. Pojďme se tedy kouknout na náš letový plán a vůbec nad čím to vlastně poletíme.



Naše první přeletová oblast je samotná počítačová hra, kde naše grafické potrubí vzniká a opravdu hodně se tam toho mele. Snížíme tedy výšku a začneme se rozhlížet.


Počítačová hra


Grafickou pipeline nevyužívají pouze počítačové hry, mohou to být i další a profesionální aplikace, které ji pro svůj běh vyloženě potřebují. Mohou to být různé 3D konstrukční aplikace založené na CAD systémech a podobně. My se ale budeme věnovat výhradně počítačovým hrám, a to pouze v rozsahu, který je pro naše téma důležitý. Určitě nečekejte, že po přečtení této kapitoly se z vás stane herní vývojář, ale některé informace by pro vás mohly být nové, zajímavé a celkově užitečné.



Každá hra je vlastně aplikace (program), která běží v nějaké nekonečné smyčce. Ta nejzákladnější a nejjednodušší herní smyčka (loop) vypadá asi nějak takto:



Po spuštění hry a načtení všech zdrojů (resources) se kód hry dostává do nekonečné smyčky Update – Draw. Je to naprosto triviální smyčka, v které aplikace zůstává po celou dobu až do okamžiku, kdy ve hře nějakým příkazem Stop, tuto smyčku opustíme a aplikaci ukončíme.

Ve fázi Update se zjišťuje interakce hráče, tedy jestli byla stisknuta nějaká klávesa, či pohnuto myší. Pokud ano, pak u všech objektů, které tvoří 3D scénu, musí být přepočtena jejich nová pozice (transformace). Ve fázi Draw je pak tato nově zkomponovaná scéna odeslána k zobrazení na monitor. Pokud ve fázi Update žádná interakce hráče nebyla zjištěna, kompozice scény se nemění, žádná transformace se počítat nemusí a je hned zavolána procedura Draw, která opět odešle, tentokrát ale nezměněnou, scénu k zobrazení na monitoru.

Existuje celá řada herních smyček, které berou v potaz i časování, nebo omezení snímkové frekvence hry. Těmi se ale zde zabývat nebudeme, nám pro další výklad bohatě postačí tato základní herní smyčka.

Nyní si všimněte jedné věci. Pokud nebyla žádná interakce a transformace objektů ve scéně tak nemusela být počítána, snímková frekvence (počet průchodů smyčkou) musí být jiná (vyšší), než kdyby interakce byla a transformace objektů se tak musela počítat. Je to samozřejmě tím, že procesor při výpočtu transformace objektů trávil ve fázi Update delší dobu (musel něco počítat) a průchod smyčkou tak zdržel.

Z pohledu výkonu (snímkové frekvence) platí tedy úměra, že čím delší čas tráví procesor v průchodu herní smyčkou na různých výpočtech scény, tím nižší bude snímková frekvence hry.

Dalším aspektem je plynulost smyčky. V průběhu hry se počet objektů ve scéně může lišit. Nejde pouze o počet, ale i o složitost jejich tvarů (model s různým počtem vertexů a polygonů). Je jasné, že procesor tráví na výpočtech transformace více času, když je objektů na scéně více a mají komplexnější model, než když jich tam je méně a jejich model je jednodušší. Snímková frekvence se tedy v čase může měnit, a to někdy opravdu výrazně.

Vývoj her jde neustále kupředu a je počítáno stále více a více komplexnějších objektů. Dnes už také nestačí počítat jednoduché transformace objektů, ale je nutné do těchto transformací započítat i jejich fyzikální chování (gravitace, tření...). Dále pak částicové efekty, prostorové zvuky atd. Prostě výpočty jsou opravdu masivní a vývojáři se s tím musí nějak poprat. Pokud by totiž všechny tyto výpočty byly prováděny v herní smyčce pouze procesorem (a nedej bože pouze pomocí jednoho vlákna), věřte, že by se snímkové frekvence dnešních her držely hodně při zemi.

Hry se tedy musí již v samotné herní smyčce nějakým způsobem optimalizovat. Jde především o rozložení zátěže CPU do více vláken (nebo jader), kde se část procesoru věnuje výpočtům jednoho druhu, další část zase výpočtům druhu jiného, zvukům, umělé inteligenci atd. Další a velmi významná optimalizace spočívá v přenesení některých masivně paralelních výpočtů na bedra grafické karty. Grafická karta je totiž (už z principu její architektury) na výpočty tohoto typu lépe navržena a procesor se s ní výkonnostně nemůže (a to ani náznakem) srovnávat.

Zkrátka a dobře, všechny tyto optimalizace mají jediný cíl, a to zkrátit čas výpočtů v herní smyčce, čímž je dosažena vyšší snímková frekvence hry. Pokud hra není takto optimalizována a počet průchodů herní smyčkou klesne třeba na 30 průchodů za sekundu (Hz), můžete vlastnit i tu nejvýkonnější grafickou kartu na světě, ale více jak těch 30 fps (snímků za sekundu) vám prostě v takové hře nedá.