reinterpretcast

Ve výše uvedeném příkladu se může zpočátku zdát, že obnovovací frekvence 0,26 Hz a snímková frekvence 0,2 FPS (snímků za sekundu) by mohly být dostatečně blízké pro správné zobrazení, nicméně při sledování běhu ukázky je zřejmé, že jsou zcela nesynchronizované, a proto pravidelně dochází k trhání obrazovky.

Skutečným problémem tohoto příkladu je, že se jedná o „aplikaci s jednou vyrovnávací pamětí“. Naše snímky zapisujeme přímo do vyrovnávací paměti, která je přiváděna na displej, a tak když chce displej obnovit svůj obraz, hrozí, že dostane snímek, který ještě není zcela dokončen. V reálné aplikaci se může snímková frekvence často dramaticky měnit v závislosti na určitých okolnostech, což může tento problém u aplikací s jednou vyrovnávací pamětí ještě zhoršit a způsobit, že trhání obrazovky bude ještě nepředvídatelnější.

Double Buffering

Jedním ze způsobů, jak některé z těchto problémů zmírnit, je použití double-bufferingu. Tento způsob vykreslování spočívá v zápisu dat snímku do zadní vyrovnávací paměti a jejich následném zkopírování do primární vyrovnávací paměti (videopřenos na displej) až po dokončení snímku. Tímto způsobem uživatel nikdy neuvidí žádné napůl dokončené snímky, že? Omyl.

Přestože trhání obrazovky bývá s dvojitou vyrovnávací pamětí výrazně omezeno, kopírování dat trvá dlouho, a proto je zcela možné, že monitor obnoví obraz v polovině procesu kopírování do vyrovnávací paměti! Tento problém si lze představit úplně stejně jako trhání v jedné vyrovnávací paměti – v předchozí ukázce si stačí představit, že pixely zapisované do primární vyrovnávací paměti nejsou generovány přímo grafickou kartou, ale místo toho jsou do vyrovnávací paměti umisťovány postupně jako výsledek operace kopírování ze sekundární vyrovnávací paměti.

Double Buffering + VSync

Další taktikou zmírnění je použití VSync. VSync, zkratka pro „vertikální synchronizaci“, funguje tak, že nechá zadní vyrovnávací paměť zapisovat do primární vyrovnávací paměti pouze ihned po obnovení zobrazení. Doufá, že operace kopírování vyrovnávací paměti bude dokončena před dalším obnovením. To funguje při výrazném snížení trhání obrazovky, má to však své problémy.

Pokud máte aplikaci s vysokou snímkovou frekvencí, VSync bude obvykle fungovat perfektně. Vaše snímková frekvence je omezena obnovovací frekvencí monitoru, ale to je v pořádku, protože monitor by stejně zobrazoval touto frekvencí. Problém nastane, když dosáhnete nižší snímkové frekvence, než je obnovovací frekvence vašeho monitoru.

Řekněme, že jste dosáhli 60 FPS na monitoru s frekvencí 75 Hz – to znamená, že vyrovnávací paměť snímků se aktualizuje při 80 % obnovovací frekvence. Pokud je zapnuta funkce VSync, musí se snímky kopírovat do vyrovnávací paměti obrazovky s dílčí obnovovací frekvencí. V tomto případě aplikace promešká „deadline“ při každém druhém cyklu, takže nakonec budeme mít jako snímkovou frekvenci polovinu obnovovací frekvence: 37,5 FPS. To je výrazně méně než 60 FPS, kterých může dosáhnout grafická karta.

TL;DR pro VSync s dvojitou vyrovnávací pamětí je, že pokud dosahujete trvale vyššího FPS, než je vaše obnovovací frekvence, může to být dobrý nápad pro snížení trhání obrazovky, ale pokud bude FPS klesat pod obnovovací frekvenci vašeho displeje, může VSync výrazně snížit FPS.

Trojitá vyrovnávací paměť + VSync

Svatým grálem celého tohoto nešvaru je obvykle trojitá vyrovnávací paměť s VSync. Limitem VSync s dvojitou vyrovnávací pamětí je, že se může výrazně snížit snímková frekvence kvůli času strávenému čekáním na správný okamžik zkopírování sekundární vyrovnávací paměti do primární. Čekání často není fantastický nápad v informatice, kde se mu lze vyhnout, takže řešením je zde jednoduše přidat další vyrovnávací paměť.

Při třech vyrovnávacích pamětech lze střídavě čerpat do dvou zpětných vyrovnávacích pamětí, takže vždy platí, že jedna vyrovnávací paměť je hotová a jedna je v procesu. To znamená, že těsně po obnovení monitoru může být ta vyrovnávací paměť, která je právě kompletní, zkopírována do primární vyrovnávací paměti – poskytuje výhody VSync bez dříve diskutované nevýhody snímkové frekvence.

Hlavní nevýhodou trojité vyrovnávací paměti tam, kde je v aplikacích k dispozici, je to, že zabírá více paměti – pokud se bavíme o grafických kartách, znamená to více VRAM (Video RAM). Jedná se o rychlou paměť, kterou využívá přímo grafická karta, a tak by v některých případech mohla trojitá vyrovnávací paměť způsobit výrazný pokles FPS, zatímco se používá paměť RAM s vyšší latencí, aby se nahradil nedostatek nativní paměti VRAM. Obvykle to není velký problém, protože množství paměti zabrané třetí vyrovnávací pamětí je často malé ve srovnání s celkovou velikostí VRAM, nicméně VSync s pouze dvěma vyrovnávacími paměťmi může v některých velmi výjimečných případech zajistit lepší snímkovou frekvenci! Houpání na houpačce, že?

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.