Podobně jako společnost Nvidia, tak také společnost AMD zařadila do svých ovladačů grafických karet funkci, která by měla softwareovou cestou “zatnout tipec” nehezkému obrazovému artefaktu jménem Tearing. V nových ovladačích Radeon Crimson 17.7.2 byla totiž společností AMD představena funkce s názvem Enhanced Sync a jak už to tak ve světě IT bývá, nápad to není nijak originální, ale jedná se spíše o evoluci něčeho, co už tady nějaký ten pátek existuje v podobě OpenGL Triple bufferingu.
Kdo četl článek o GPU pipeline, zejména pak její čtvrtou část “Grafická pipeline IV: Monitor”, jistě již dávno ví, co je to Tearing, Double buffering, Verikální synchronizace obrazu a podobné výrazy. Těm, kteří tento článek nečetli, ani ho číst nechtějí a výše uvedené výrazy jim proto nic moc neříkají, se pokusím alespoň ve stručnosti vše objasnit.
Double buffering, Tearing a vertikální synchronizace
Klasický Double Buffering pracuje tak, že grafická karta renderuje snímek do tzv. Back bufferu a druhý buffer s názvem Front Buffer, ve kterém je umístěn vždy snímek předcházející a hotový, slouží výhradně k prezentaci (Scan out) snímku na monitor počítače. Data z Front bufferu jsou do monitoru přenášena rychlostí, která je rovna obnovovací frekvenci monitoru a v případě nejpoužívanějších 60 Hz monitorů jim tedy tento přenos trvá 16,7 ms (včetně cca 0,7 ms, které připadají na VBI - doby, při které se na monitor nezasílají obrazová, ale pouze nějaká další podružná data).
Pokud grafická karta tvorbu snímku v Back bufferu dokončí, úlohy těchto bufferů se prohodí. Back buffer se stává Front bufferem, ze kterého jsou data přenášena na monitor, a Front buffer se zase stává Back bufferem, do kterého začne GPU renderovat snímek další. Takto to jde stále dokola v nekonečné smyčce.
Při tomto způsobu prezentace však vzniká tzv. Tearing, tedy jakési „roztržení“ obrazu, které je způsobeno nevhodným načasováním prohozením adres Back a Front bufferů v době, kdy byl ještě prováděn Scan out původního Front bufferu a na monitor se tak dostává obraz, který je složený ze dvou či vícero snímků.
Pokud například grafické kartě vyrenderování jednoho snímku do Back bufferu bude trvat 5 ms (200 FPS), za dobu 16,7 ms (kdy jsou přenášena data na monitor) se oba buffery prohodí třikrát (16,7 / 5) a výsledný obraz na monitoru počítače se tak bude skládat celkem ze 4 snímků (třikrát roztržený obraz).
Jediným možným způsobem, jak se Tearingu nadobro zbavit je velmi přesné načasování prohození (Swap/Flip) obou bufferů do doby, kdy na monitor nejsou zasílána žádná obrazová data a právě takovouto dobou je VBI (Vertical Blanking Interval) nebo také VBLANK. Pokud toto zajistíme (zapnutím funkce VSync ve hře nebo ovladačích), Swap obou bufferů bude proveden přesně v době VBI a nepříjemného Tearingu se tak zbavíme. Bohužel ale a jak už to tak bývá, se zapnutým VSync nastanou také úplně jiné komplikace.
Opět si představte příklad se dvěma buffery a grafickou kartou, která renderuje snímky rychlostí 5 ms (200 FPS). Vertikální synchronizace obrazu je kvůli potlačení Tearingu nyní zapnuta. Z Front bufferu jsou přenášena data na monitor a v Back bufferu je vyrenderován snímek za 5 ms. Do doby VBI ještě zbývá nějakých 11 ms a grafická karta nemá kam renderovat snímek další, protože Back buffer je zaplněn a bude uvolněn (nastane Swap) až za 11 ms. Grafické kartě tedy nezbude nic jiného, nežli svou práci zastavit a čekat na Swap a uvolnění Back bufferu. Snímková frekvence nám poklesne z původních 200 FPS (5 ms) na 60 FPS (16,7 ms) a doba zobrazení snímku na monitoru se tak oddálí, čímž narůstá zpoždění (Input latency nebo Lag) právě o těch 11 ms na každý jednotlivý snímek. Takže co s tím?