Grafická pipeline: jak se tvoří obraz III
4.3.2015, Pavel Šantrůček, článek
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:
VSync
Tearing je opravdu nepříjemnou vadou na kráse při hraní počítačových her. Proto přišli inženýři (a nebyli to ti z NDR) s nápadem, jak tearingu nadobro zatnout tipec. Řekli si, co kdybychom Swap (změna ukazatele Front/Back Buffer) neprováděli ihned po dokončení snímku grafickou kartou v Back Bufferu, ale počkali si na nějakou vhodnější dobu, až bude mít video kontrolér data z Front Bufferu kompletně oskenovaná, ale ještě nezačne nové skenování. No a právě takovou dobou je ten moment, kdy video kontrolér vytváří Vertical Blanking Interval (VBI). VC už má data snímku za sebou a právě vytváří VBI. Kdo dával dobrý pozor u monitoru, tak ví, že VBI je v našem případě těch 45 „jalových“ řádek signálu navíc, které monitor nezobrazuje.
Výsledkem tohoto řešení je, že grafická karta neprovádí Swap zásobníků, jak se jí zlíbí a jakmile má dokončený snímek v Back Bufferu, ale Swap je synchronizován se signálem monitoru do doby, kdy video kontrolér vytváří VBI. Tomuto řešení se říká Vertical Synchronization neboli VSync.
My si to ale pro jistotu nakreslíme do našeho časového diagramu. Tentokrát si ale zakreslíme zvlášť Back Buffer a Front Buffer. Back Buffer totiž představuje práci a vytížení grafické karty, kdežto Front Buffer představuje to, co uvidíme nakonec na monitoru:
Inženýři sice svůj úkol splnili na jedničku, po tearingu nikde ani stopa, ale když se podíváme na ten diagram pořádně, dostali jsme se do problémů jiných. Snímková frekvence šla rapidně dolů a také vytížení grafické karty se propadlo. Proč? Zapnutím VSync se snímková frekvence grafické karty synchronizuje se snímkovou frekvencí monitoru, o které víme, že v našem případě nemůže být vyšší než 60 snímků za sekundu (60Hz monitor).
Co z našeho diagramu stojí ještě za zmínku je, že v průběhu prvního skenování vznikl v Back Bufferu hotový Snímek 1 a byl při prvním Swapu „přesunut“ do Front Bufferu, ze kterého si ho VC vyzvedne ve druhém skenování. Potud to je jasné, ale v průběhu tohoto druhého skenování žádný nový snímek v Back Bufferu nevznikl (Snímek 2 byl dokončen až ve třetím skenu), takže žádný Swap neproběhl. Na monitor se ale nějaká data poslat musí, nezbývá tedy nic jiného, než ve třetím skenu poslat opětovně Snímek 1.
Jak vidíte, každá sranda něco stojí a při zapnutí funkce VSync se sice zbavíme tearingu, ale snímková frekvence jde dolů. V nejlepším možném případě je snímková frekvence hry rovna konstantní snímkové frekvenci monitoru a s tím nic neudělá ani žádný G-Sync nebo Adaptive-Sync. Nevěříte? Tak se nad těmito novými vymoženostmi prolétneme, ale až někdy příště, protože my pospícháme a VSync nebylo jediné, co naše inženýry napadlo. Oni totiž vymýšleli a špekulovali dále.