Triple buffering a v-sync prakticky ve World of Tanks 8.2

17. 12. 2012

Sdílet

 Autor: Redakce

Double a triple buffering: proč hned tři buffery

V nastavení některých her najdete položku triple buffering, o které většina lidí buď nemá vůbec ponění, k čemu je dobrá, nebo má mlhavou představu o tom, že to nějak ovlivňuje výkon a vykreslování snímků a souvisí to s buffery, do kterých grafická karta připravuje obraz předtím, než se vykreslí na monitor.

V diskuzích, ve kterých se lidi ptají, co teda mají ve hře nastavit, aby dosáhli nejlepšího výsledku, najdete dost protichůdná tvrzení – jednou se dozvíte, že jej máte vypnout, protože to sráží výkon a bez toho hra běhá rychleji, jindy zase že to výkon zvyšuje, někdy se řeší, zda to způsobuje microstuttering nebo zda mu naopak brání.

Koncem minulého týdne vyšel patch 8.2 pro World of Tanks, který řeší řadu podstatných problémů s výkonem grafiky, kvůli nimž jsme odkládali tradiční srovnání výkonu grafických karet i průvodce nastavením. Pokud vás World of Tanks nezajímá, nemusíte utíkat, většina věcí by měla platit pro vykreslování grafiky obecně.

World of Tanks je hra velmi populární a také velmi náročná na hardware. Nabízí obrovské množství nastavení a možná i kvůli tomu neexistuje žádný kompletní průvodce nastavením. Na testování je toho opravdu hodně, takže si vše rozdělíme do několika menších ucelených článků.

Dnes se zaměříme na to, co dělají na zdánlivě nenpápadná a neškodná zatržítka triple buffering a v-sync a při té příležitosti se podíváme i na ještě celkem čerstvou novinku – adaptivní vertikální synchronizaci u GeForce.

V některých hrách nastavení triple bufferingu nenajdete. V takovém případě můžete ještě vyzkoušet utilitu Direct3D overrider, která je součástí kdysi populárního letitého RivaTuneru. Jeho autor na něm bohužel přestal pracovat poté, co se začal věnovat vývoji komerčních utilitek MSI Afterburner a EVGA Precision.

 

Protože jde o aplikaci, která už není několik let vylepšovaná a udržovaná, nikdo vám nezaručí, že bude fungovat i v novějších hrách. Kromě zapnutí či vypnutí triple bufferingu umí ještě další podstatnou věc – pod Windows Vista a Windows 7 vynutit vertikální synchronizaci i na Radeonech.

Ovladače AMD Catalyst sice nastavení vertikální synchronizace v ovládacím panelu mají podobně jako Nvidia, v případě novějších her a operačních systémů už se ale AMD přiklání k pravidlu, že o vertikální synchronizaci má rozhodovat hra samotná a nikoliv ovladače a nastavení nefunguje (nebo alespoň na žádných ovladačích a grafické kartě, u které jsem jej za poslední tři roky zkoušel, jsem si toho nevšiml)

Vysvětlovat, jak funguje vertikální synchronizace v kombinaci s double a tripple bufferingem, by vydalo na samostatný článek a nebylo by to záživné a jednoduché čtení. Teorii proběhneme jen stručně a raději se podíváme rovnou na to, jak se toto nastavení chová v praxi právě na World of Tanks. Pokud by vás to ale přece jen zajímalo a zvládáte angličtinu, doporučuji vám projít si článek na Anandtechu, který se problematikou bufferingu, vertikální synchronizace a časování vykreslení snímků zabývá podrobněji.

Na co tolik bufferů?

Jak se liší double a triple buffering zkusím (za cenu určité ztráty přesnosti) vysvětlit jen v několika větách.

Dříve se využíval pro vykreslování jeden buffer (tzv. single buffering). Grafická karta do něj posílala obraz a monitor jej vykresloval. Pokud se obraz z bufferu vykresloval na monitor a karta jej přitom zároveň měnila, výsledkem mohlo být spojení dvou či více různých snímků, čímž vznikaly „chyby“ v obraze.

Aby se tomu zabránilo, začaly se používat buffery dva, tedy tzv. double buffering. Při něm (což v případě World of Tanks znamená s vypnutým triple bufferingem) se vykresluje jeden snímek do jednoho bufferu (tzv. zadní buffer), zatímco na monitor se vykresluje dříve vypočtený snímek z bufferu druhého (přední).

Má to jednu podstatnou nevýhodu – když karta skončí s vykreslováním do zadního bufferu dřív, než monitor vykreslí obraz z prvního, musí grafika s renderingem čekat, než monitor dokreslí a přední buffer uvolní.

Může se tak stát, že karta po dokončení renderingu snímku zahálí a čeká, než dopracuje monitor a uvolní se buffer, i když by potřebovala pracovat do zásoby, protože jí rendering dalšího snímku bude trvat déle, než trvá překreslení monitoru obsahem zadního bufferu v dalším cyklu.

S triple bufferingem se proto do cesty přidává jeden „rezervní“ buffer:

I když se z prvního bufferu vykresluje snímek na monitor a ve druhém už je připravený další snímek, grafická karta se nemusí ohlížet, jak je na tom monitor s vykreslováním a může rovnou začít renderovat do třetího volného bufferu.

V praxi je to o malinko složitější a méně názorné, buffery nejsou umístěné za sebe a obraz se neposouvá z bufferu do bufferu, ale jsou na stejné úrovni a místo posouvání obsahu z jednoho do druhého se mezi nimi přepíná (mluví se o tzv. page flipping nebo buffer swappingu). Na prvním obrázku je double buffering.

Analogicky to funguje u triple bufferingu, ale s jedním podstatným rozdílem. Protože je k dispozici buffer navíc, z předního se vykresluje a v jednom ze zadních je připravený další hotový snímek. Ten se může začít vykreslovat okamžitě, jakmile monitor dokreslí rozpracovaný snímek. Do třetího, který je k dispozici, se vykresluje.

Pokud grafická karta stihne i poslední snímek dokončit ještě předtím, než monitor dokreslí snímek ze předního bufferu, lze buffery přepnout. Za front bufferem tedy bude připravený nejnovější snímek.

A buffer se starším snímkem může grafická karta vyprázdnit a začít do něj vykreslovat snímek následující. Proto zapnutí v-sync s triple bufferingem kartu nebrzdí.

Triple buffering a vertikální synchronizace

Vertikální synchronizace

Dalším termínem, který nezní příliš lákavě, je vertikální synchronizace. Je ale užitečná, omezuje tzv. tearing, tedy odtrhávání části obrazu při překreslování. Pokud netušíte, co to je a k čemu je to dobré, projděte si náš nedávný článek, kde je to vysvětleno podrobněji.


foto-0007

Když má běžně 60Hz monitor při zapnuté vertikální synchronizaci v bufferu včas připravený snímek, zvládá snímky vykreslovat rychlostí 60 fps. Pokud ale před začátkem překreslení monitoru není další snímek ještě připravený, musí na displeji zůstat ten starý a překreslení se vynechá.

Rychlost vykreslování potom klesá na zlomky 60 fps. Pokud musí vynechat jeden snímek (tzn. vykresluje každý druhý), klesá okamžitá snímková frekvence na 30 fps, když vynechává dva, vykresluje už jen každý třetí (a padá jen na 20 fps) atd. K tomu dochází typicky právě při double bufferingu.

Výsledek je vidět v grafu, kde vykreslování přeskakuje mezi průměrnými 20, 30 a 60 fps. Nenechte se zmást několika hodnotami „mezi“, ty vznikly tím, že jde o průměr z několika měření za celou sekundu, během které frekvence zrovna přeskakuje dvěma hodnotami – 20 a 30 fps.

V grafech je klasický průběh s průměrnými fps za sekundu (červená čára) i hodnota fps přepočtená na každý jednotlivý snímek z frametimes.

Vyšší, nebo nižší výkon s triple bufferingem? FRAPSu nevěřte!

Protože karta s triple bufferingem a zapnutou vertikální synchronizací nemusí při vykreslování snímků čekat, než se vyprázdní buffer se snímkem pro monitor, ale může po přesunutí právě vyrenderovaného snímku do bufferu rovnou počítat další, v záznamu je průběh výkonu prakticky stejný jako s vypnutou vertikální synchronizací:

Z toho vyplývá, že s aktivní vertikální synchronizací a triple bufferingem programy pro měření výkonu „lžou“. Nedokážou totiž změřit počet skutečně zobrazovaných snímků a výkon (tedy výkon až na straně monitoru), ale jen na jeho začátku na straně grafické karty při vykreslování do bufferů.

Kolem 60 fps zase všechno jinak?

Analogicky by tomu mělo být i v případě, že karta běží dost rychle na to, aby monitor vykresloval rychlostí 60 fps. Bez triple bufferingu by měla snímková frekvence přeskakovat mezi 60, 30, 20 fps atd. a s ním by hra neměla být omezená.

Jaké bylo moje překvapení, že jsem snížil rozlišení na 1600 × 900 bodů, abych zvedl snímkovou frekvenci nad 60 fps a zjistil, že se hra chová jinak. Naproti předpokladům se ani s aktivním triple bufferingem hra nedostala přes průměrných 60 fps.

Znamená to, že triple buffering nefunguje? Neznamená. Když se podíváte na stejné nastavení bez triple bufferingu, zjistíte, že tady už se hra chová podle předpokladů, tedy že se framerate mění mezi 60 a 30 fps, zatímco s triple bufferingem při poklesu pod 60 fps grafika renderovala rychleji než na 30 fps.

Co z toho vyplývá? Nenapadá mě nic jiného, než že má World of Tanks pravděpodobně i limit na snímkovou frekvenci (tzv. frame rate cap) na 60 fps, který je aktivní při zapnuté vertikální synchronizaci. K tomu, že hra umí snímkovou frekvenci limitovat, mě vede i druhá věc – během celého testování jsem se i při vypnuté vertikální synchronizaci, s jakoukoliv grafikou a jakýmkoliv nastavením nedostal přes hodnoty kolem 125 fps.

 World of Tanks 8.2
World of Tanks 8.2

 

Testovací sestava a výsledky měření

Testovací sestava je shodná jako pro testy grafických karet. Úlohu grafické karty sehrála GeForce GTX 460.

Jako testovací platforma posloužila základní deska Gigabyte X79-UD5 s BIOSem F10. Procesor je šestijádrový Core i7-3960X s TDP 130 W, který je přetaktovaný na 4,2 GHz při 1,36 V. Asistuje mu 16GB kit operačních paměti DDR3 od Kingstonu.

  • základní deska: Gigabyte X79-UD5
  • procesor: Core i7-3960X (deaktivovaný HTT, C1E, EIST), 4,2 GHz na 1,36 V
  • chladič CPU: Noctua NH-D14
  • paměti: 4× 4 GB Kingston DDR3 KHX2133C11D3K4/16GX
  • zdroj: Enermax Revolution 85 ERV920EWT-00, 920 W
  • pevný disk: Intel SSD 510 (250 GB)
  • skříň: Gelid DarkForce
  • operační systém: Windows 7 x64

World of Tanks 8.2
World of Tanks 8.2

Triple buffering a vypnutý v-sync

Při měření vlivu nastavení v-sync a triple bufferingu na výkon jsem vyzkoušel všechny kombinace. Předně to bylo srovnání výkonu bez a s triple bufferingem a vypnutou vertikální synchronizací:

  • triple buffering off, v-sync off (jeden buffer, výkon nic nebrzdí), GeForce GTX 460
  • triple buffering on, v-sync off (dva buffery, výkon nic nebrzdí), GeForce GTX 460

GeForce GTX 460, v-sync off, triple buffering off

GeForce GTX 460, v-sync off, triple buffering off

Triple buffering a zapnutý v-sync

Klasická vertikální synchronizace je zapnutá přes nastavení ve hře, a na další stránce najdete, jak funguje adaptivní vertikální synchronizace, která je specialitou u novějších GeForce, je vynucená v ovladačích.

  • triple buffering off, v-sync on (jeden buffer, karta musí čekat na vyprázdnění bufferu)
  • triple buffering on, v-sync on (dva buffery, karta nečeká na vyprázdnění prvního)

GeForce GTX 460, v-sync on, triple buffering off

GeForce GTX 460, v-sync on, triple buffering on

Triple buffering a vynucený v-sync

V dalším grafu je už zminňované chování hry při nastavení pohybujícím se kolem 60 fps. Všimněte si, že v prvním grafu bez triple bufferingu jsou úseky se 30 fps mnohem delší. V třetím grafu jsem ještě vyzkoušel triple buffering ve hře vypnout a vynutit jej prostřednictvím Direct3D overrideru. Úspěšně.

  • triple buffering off, v-sync off (jeden buffer, výkon nic nebrzdí), GeForce GTX 460
  • triple buffering on, v-sync off (dva buffery, výkon nic nebrzdí), GeForce GTX 460
  • triple buffering on (ve hře vypnutý, vynucený přes D3D overrider), v-sync off (dva buffery, výkon nic nebrzdí), GeForce GTX 460

Specialita Nvidie: adaptivní v-sync

World of Tanks 8.2
World of Tanks 8.2
 

GeForce GTX 460, adaptivní v-sync a triple buffering

Adaptivní vertikální synchronizace je specialitou karet GeForce. Pokud grafická karta stíhá renderovat snímky rychleji než je monitor zobrazuje, je v-sync aktivní a počet renderováných snímků je limitovaný zobrazovací frekvencí monitoru. Když je snímková frekvence nižší, vertikální synchronizace se vypíná. V našem případě znamená plný výkon 60 Hz u monitoru a 60 fps ve hře. GeForce GTX 460 ale nemá při testu na tomto nastavení dostatek výkonu a přes 60 fps se nedostává, takže běží po celou dobu bez vertikální synchronizace.

Proto jsem vyzkoušel ještě adaptivní v-sync s polovičním výkonem, který posouvá limit na poloviční snímkovou frekvenci, tedy 30 fps. Když se hra dostane pod tuto hodnotu, v-sync se vypíná.

  • triple buffering off, v-sync adaptivní (plný výkon)
  • triple buffering off, v-sync adaptivní (poloviční výkon)
  • triple buffering on, v-sync adaptivní (poloviční výkon)

adaptivní v-sync (plná rychlost), triple buffering off

adaptivní v-sync (poloviční rychlost), triple buffering off

adaptivní v-sync (poloviční rychlost), triple buffering on

Zajímavé je, že nastavení triple bufferingu při adaptivní synchronizaci nemá (na rozdíl od v-sync aktivního ve hře) vliv na hlášenou snímkovou frekvenci – vše se tváří, jako by triple buffering nebyl aktivní

Zároveň ale nedochází k tomu, že by se hra při propadu snímkové frekvence pod 30 fps pohybovala na menších krocích (20 fps, 15 fps, 10 fps...), ale běží na maximu. Výkon karty je tedy pod horními 30 fps stejný, jako by šlo o kombinaci v-sync s triple bufferingem.

Zase ten microstuttering a závěrečné shrnutí a doporučení

Zase microstuttering

Musím se vrátit ještě k jedné věci. Všímavější už asi v grafech zaregistrovali microstuttering – krátké, ale o to intenzivnější zadrhávání, které je tentokrát znát ve větší míře i na GeForce. Po většinu času je průběh vyrovnaný, ale jednou (či několikrát) za čas (1–10 s) dochází k výraznému zadrhnutí a propadu výkonu asi o dvě třetiny.

Spíše než grafická karta bude v tomto případě na vině samotná hra. Nepravidelnost vykreslování je největší hned v úvodu při intenzivním pohybu kamery, nejspíš ve chvílích, kdy hra dokresluje objekty, které byly mimo záběr. K občasnému trhání dochází při plynulejších pohybech kamery. Když kamera stojí na místě, zadrhávání prakticky zmizí.

Tomu, že jde o záležitost enginu, nasvědčuje i další věc – při opakování měření se trhání objevuje vždy na stejných místech, zatímco v případě microstutteringu způsobeném nepravidelným vykreslováním snímků se při opakování průběhu rozložení špiček i jejich intenzita různí (viz test Far Cry 3).

Závěrečná doporučení

Co se týká triple bufferingu, v případě, že používáte vertikální synchronizaci, bych jej doporučoval zapnout, pokud to nezpůsobí jiné problémy nebo nezpozorujete nižší výkon (nemyslím tím ale na ukazateli fps či na průměrné snímkové frekvenci; jak jsme se přesvědčili, v kombinaci s triple bufferingem neodpovídá hodnota zobrazovaná diagnostikou tomu, co vykresluje monitor).

 

ICTS24

Co si z toho ještě máte odnést? To, že když monitorovací programy při zapnuté vertikální synchronizaci a zapnutém triple bufferingu hlásí vyšší framerate, neznamená to, že se stejný počet snímků zobrazuje i na monitoru. Monitor může buď obraz vykreslit(= 60 fps) nebo vykreslení vynechat (= 30, 20, 15 fps...), ale nic mezi tím (třeba 48 fps). Pořád ale platí, že může grafická karta v takovém případě pracovat na dalších snímcích bez ohledu na to, jak je na tom monitor s vykreslováním a výsledný výkon by tak měl být vyšší.

 World of Tanks 8.2
World of Tanks 8.2