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:
  1. Double Buffering
  2. Monitor
  3. Screen Tearing
  4. VSync
  5. Triple Buffering a závěr

Triple Buffering


Pokud se podíváme znovu na náš minulý diagram s VSync, zjistíme, že šla dolů nejen snímková frekvence, ale také se nám tam grafická karta pěkně fláká. Vytížení grafické karty v diagramu reprezentuje Back Buffer a vidíte, že tam vznikly mezery mezi koncem vytvoření jednoho a začátkem tvorby dalšího snímku (idle). Je to tím, že grafická karta nemohla vytvářet nový snímek, protože Back Buffer byl ještě obsazen snímkem předchozím a čekal na Swap.


VSync diagram


To je sice dobrá zpráva pro všechny, kteří mají rádi u grafických karet nízkou spotřebu, ale pro výkon ve hrách to opravdu dobré není. Naše inženýry tedy napadlo, že by do Swap Chain zařadili ještě jeden Back Buffer, který by grafická karta mohla využít k vyššímu výkonu s VSync. Protože tak budou využity celkem tři zásobníky, tomuto řešení se říká "Triple Buffering".


Triple buffering


My si to tedy opět raději nakreslíme, jak by to asi vypadalo, kdyby Swap Chain obsahoval druhý zásobník typu Back Buffer, do kterého by grafická karta mohla vytvářet nové snímky v případě, když je první Back Buffer zaplněný.


Triple buffering diagram


Obrázek snad ani není třeba sáhodlouze popisovat. Vše se zlepšilo, tearing samozřejmě není, snímková frekvence šla nahoru a tam, kde u double bufferingu grafická karta stála, tam nyní nestojí, ale pracuje právě s tímto třetím zásobníkem Swap Chain. Vše je tedy tak, jak by být mělo. Snad jedině ti šetřílci energie budou muset zamáčknout slzu. Ale opravdu je tandem Triple Buffering a VSync pro nás tím pravým ořechovým?

Už několikrát jsme se v naší minisérii o grafickém potrubí otřeli o výraz „Input Lag“, který lze do češtiny volně přeložit jako „zdržení“. Při triple bufferingu nám totiž do našeho potrubí přibyl další zásobník, takže doba od funkce Update v herní smyčce (pamatujete?), kde je testován váš uživatelský vstup do hry (pohnutí myší, zmáčknutí klávesy atd.), až k zobrazení snímku na monitoru se tak prodloužila.

Pokud budeme počítat, že kliknutím na tlačítko myši provedeme výstřel v naší hře, tak obrázek s naším výstřelem poputuje grafickým potrubím asi nějak takto. Nějakou dobu potrvá, než se vytvoří Draw Calls a přejdou do DirectX. Tam máme zejména Command Queue, ve kterém už mohou být nachystány až tři předchozí snímky. Na dalším dřívějším snímku pracuje grafická karta v Back Bufferu, další a ještě starší snímek je u triple bufferingu v druhém Back Bufferu a aby toho nebylo málo, tak další, ten úplně nejstarší snímek, je ve Front Bufferu, odkud se přenáší na monitor. Pokud jsme počítali správně, tak před tím, než se náš nový snímek s výstřelem prodere potrubím až do Front Bufferu, musí být zpracováno ještě dalších 6 předchozích snímků. A to už je opravdu hodně.

Ale to bylo jen tak na okraj, my už dnes žádný Input Lag řešit nebudeme. Máme toho myslím až nad hlavu a další informace by už nás dnes mohly totálně zahltit. S naším letadlem tedy přistaneme a pokusíme se o nějakou rekapitulaci toho, co jsme viděli nejen dnes, ale nad celým grafickým potrubím.

Předně, pokud jste se mnou letěli nad úplně celým potrubím grafické pipeline, jistě se mnou budete souhlasit, že největší Achillovou patou je právě ta poslední část, tedy monitor a jeho komunikace s grafickou kartou. Je to zapříčiněno tím, že monitor pracuje v jiném „rytmu“ než zbytek pipeline a všechny pokusy o sladění (synchronizaci) jsou chvályhodné, nicméně ne příliš účinné. Každé řešení sice jednu chybu napraví, ale také nějakou další způsobí, tedy klasické vytloukání klínu dalším klínem. Pokud bychom shrnuli rozumy dnešního dne, pak asi takto:
  1. Monitor pracuje s konstantní snímkovou frekvencí, která je závislá na výkonu jeho elektroniky
  2. Snímek zaslaný na monitor neobsahuje pouze data ze hry, ale i další přidružené informace
  3. Double Buffering dopraví snímek na monitor nejrychleji, ale vždy způsobí Tearing
  4. VSync zamezuje Tearingu, ale způsobí uzamčení snímkové frekvence hry do oblasti snímkové frekvence monitoru, snižuje vytížení grafické karty a zvyšuje Input Lag
  5. Triple Buffering napravuje chyby VSync s vytížením grafické karty, ale způsobí další zvýšení Inpu Lagu

Sami vidíte, že žádné povzbudivé závěry se dnes konat nemohou a ani nebudou, bohužel.


Závěr


Celá grafická pipeline je opravdu věcí sofistikovanou a díky její komplexnosti není jednoduché jí hned porozumět a pochopit. Mou snahou bylo popisovat složité věci jednoduše a tak, aby je pochopil i méně zkušený čtenář. Pokud, díky těmto článkům, problematiku zvládl alespoň jeden jediný z vás, úkol byl splněn a vítám ho ve velmi zajímavém světě grafických karet. Samozřejmě v článcích chybí spoustu dalších zajímavých a důležitých informací, které jsem někdy vynechal záměrně, abych věci příliš nekomplikoval, a někdy jsem na ně prostě a jednoduše zapomněl. Možná to napravím někdy příště v nějakém takovém „afterparty“ článku o grafické pipeline.

Tak či onak, letadlo příliš hluboko do hangáru parkovat nebudu, protože v grafickém potrubí je ještě spoustu dalších utajených a zajímavých zákoutí, kam bychom se mohli společně proletět zas někdy příště. Vaše náměty, připomínky, či návrhy dalšího letového plánu jsou jako vždy vítány v diskuzi pod článkem.
Doporučujeme náš velký přehled desktopových grafických čipů.