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 tvoří obraz III

4.3.2015, Pavel Šantrůček, článek
Grafická pipeline: jak se tvoří obraz III
Máme za sebou dva kontrolní lety nad naším grafickým potrubím. Dnes nás čeká let závěrečný, na jehož konci bychom už konečně rádi viděli nějaký ten obrázek z naší hry na samotném monitoru počítače.
Kapitoly článku:
Nejdříve doporučujeme si přečíst:
1. díl série: Grafická pipeline: jak se vytváří obraz
2. díl série: Grafická pipeline: jak se tvoří obraz II

V prvním letu jsme zjistili, jak nám počítačová hra vytváří Draw Calls a jak nám tyto požadavky na vykreslení prochází potrubím DirectX. Druhý let nás zase poučil o tom, jak se s těmito požadavky postupně vypořádala grafická karta a nakonec umístila finální snímek do zásobníku jménem Back Buffer. Dnes tedy jdeme do finále.

Je mi jasné, že valná většina z vás už jistě někdy slyšela výrazy jako Double Buffering, VBLANK, VSync či Tearing, které jsou úzce svázané s problematikou kolem přenosu obrazu z grafické karty do monitoru počítače. Také článků zabývajících se tímto tématem je na internetu poměrně velké množství a tak nepochybuji o tom, že mnozí z vás jsou také s touto problematikou více či méně detailně seznámeni. Já však musím a budu popisovat tuto část pipeline tak, jakoby o ní ještě nikde nic napsáno nebylo a čtenáři neměli o ničem ani potuchu. Věřím ale, že i ostřílení borci si v tomto díle najdou něco, co ještě nevěděli a nebude tak pro ně čtení tohoto článku ztrátou času.

Cílem našeho dnešního letu bude zjistit, jakým způsobem funguje monitor a jak s ním vůbec naše grafická karta komunikuje. Náš dnešní letový plán není pevně stanoven, protože budeme létat mezi grafickou kartou a monitorem počítače podle toho, kam nás vítr a hlavně různé problémy zanesou. Bez dlouhých okolků tedy půjdeme rovnou na věc a kde jinde začít než tam, kde jsme minule skončili. Vzhůru tedy ke Swap Chain a jeho Back Bufferu.


Monitor to gpu


Double Buffering


V minulém díle jsme si řekli, že výsledný snímek naší hry je grafickou kartou postupně vytvářen v úložišti zvaném Back Buffer, který je součástí uskupení zásobníků pojmenovaného Swap Chain. Kromě Back Bufferu obsahuje Swap Chain minimálně ještě jeden zásobník s názvem Front Buffer, který je povinný a slouží k prezentaci snímku na monitoru počítače. Důvod několika zásobníků je poměrně prostý. Back Buffer, jako pracovní zásobník, obsahuje data nehotového snímku, kde ho grafická karta teprve postupně vytváří a pokud bychom jeho obsah chtěli zobrazit na monitoru, nebyl by to věru pěkný pohled.

Front Buffer pak jako prezentační zásobník obsahuje vždy a za všech okolností snímek hotový. O samotnou prezentaci, tedy odesílání finálního snímku na monitor počítače, se stará Video Controller (VC), který je součástí grafické karty. VC čte data z Front Bufferu (tedy data hotového snímku) a vytváří TV signál, který je pro monitor srozumitelný, takže náš snímek může korektně zobrazit.

Swap Chain tedy funguje tak, že v zásobníku jménem Back Buffer je obrázek vytvářen a jakmile je dokončen, je jeho obsah (snímek) přenesen do zásobníku Front Buffer, který VC používá pro čtení (skenování) a vytváření vlastního signálu pro monitor počítače. Jakmile je snímek přenesen do Front Bufferu, Back Buffer je uvolněn pro tvorbu dalšího snímku grafickou kartou. Jak vidíte, nic složitého na tom není. Pokud je princip jasný, zbývá pouze objasnit způsob, jakým je přenos mezi zásobníky realizován.

Samozřejmě, že by samotný přenos šel provést jednoduchým kopírováním mezi zásobníky, ale to je celkem pracné a také to zabere nějaký drahocenný čas, který grafická karta nemá. Místo nákladného kopírování se zde používají ukazatele (Pointer). Oba zásobníky jsou umístěny v paměti grafické karty (VRAM) a jejich obsah začíná na nějaké paměťové adrese. Pomocí adresy do paměťového prostoru pak tedy víme, kde je a co obsahuje libovolný zásobník.

Princip je následující:
  1. GPU pracuje v Back Bufferu na novém snímku a zároveň je obsah Front Bufferu odesílán pomocí VC na monitor
  2. GPU dokončilo práci na snímku v Back Bufferu. Pomocí změny ukazatele (jeho adresy v paměti) sdělí VC, že od teď právě tento zásobník bude plnit funkci Front Bufferu a ať tedy posílá snímek na monitor odtud. Samozřejmě bývalý Front Buffer se tak stává pracovním Back Bufferem, kde může GPU vytvářet snímek následující.

Pointer
Pointer odkazuje na počáteční adresu zásobníku v paměti

Všechno to pracuje v nekonečné smyčce a tomu prohození adresy v ukazateli, které má za následek také prohození funkcí zásobníků Back/Front Buffer, se říká Swap (nebo také Flip). Protože výše uvedený příklad využíval k práci zásobníky dva, je tento způsob řešení nazýván „Double Buffering“. Swap Chain samozřejmě může využívat systém i s více zásobníky, ale o tom si povíme až později.





Systém zásobníků Swap Chain a to, jak spolu tyto zásobníky kooperují na odesílání finálního snímku na monitor, je tedy za námi. Zbývá snad jen něco málo říct o jejich velikosti, kterou v paměti grafické karty zabírají.

Velikost každého z těchto zásobníků je přímo úměrná rozlišení, které máme ve hře nastaveno a použité „hloubce“ barev. Jako příklad budeme uvažovat, že máme ve hře nastaveno FullHD (1920x1080) rozlišení a budeme používat standardní barevnou hloubku 24bit RGB. 24bit RGB znamená, že každá složka (komponent) barvy je tvořena s přesností 8bit (8bit Red, 8bit Green, 8bit Blue) a samotná barva může tedy nabývat 16,7 miliónu odstínů (256x256x256). Velikost jednoho zásobníku by tedy měla být 1920 x 1080 x 3Byte(24bit) = 6 220 800 Bytes, cca tedy 6 MB. V našem příkladu Double Buffering obsadí v paměti grafické karty cca 12 MB, protože pracuje se dvěma zásobníky.

Swap Chain využívající Double Buffering je tedy snad osvětlen. Víme také, že pomocí obsahu Front Bufferu a Video Controlleru je vytvářen TV signál, který je zasílán do monitoru počítače. V tomto signálu musí být v nějaké formě uložen náš hotový snímek. Vezmeme tedy naše letadlo a rychle přeletíme k monitoru počítače, kde se pokusíme náš snímek odchytnout. Cestu známe, protože poletíme nad kabelem s nějakými nápisy „HDMI“, který nás tam bezpečně dovede.
Doporučujeme náš velký přehled desktopových grafických čipů.