Jak snížit systémovou latenci?
Jak jste mohli v minulé kapitole vidět, celková systémová latence je dána prostým součtem jednotlivých menších latencí, které nám vznikají v systému na různých místech. Chceme-li tedy snížit systémovou latenci, musíme se zaměřit právě na tato jednotlivá kritická místa pipeline. Něco napravit můžeme, něco zas ne a něčemu se zas můžeme jednoduše vyhnout.
Peripheral latency
Pokud se jedná o vstupní zařízení (klávesnice, myš, gamepad) tam se (až na výjimky) latence pohybují na opravdu minimálních hodnotách řádově kolem jednotek milisekund a těžko tedy lze něco opravdu významněji vylepšit. Ale ano, můžete si koupit nějakou speciální myšku s nízkou latencí, ale věřte, že se sice dobrat k nižší hodnotě latence můžete, ale nic významného to většinou opravdu nebude. Pokud byste si přeci jen chtěli zakoupit nějakou tu myšku s nízkou odezvou, jejich seznam podle naměřených latencí naleznete zde. Nezapoměňte ale, že nízká latence u myši není vše, důležitější může být její váha, úchop či celkové pohodlí při hře!
Display latency
U monitoru, tedy výstupního zařízení je to jiná. Tady se investice do monitorů s rychlejší odezvou jistě vyplatí a můžete si tak polepšit v řádu i kolem desítek milisekund. Naprostou pohromou pro latence je pak ve hře zapnutá vertikální synchronizace (VSync), zvláště pak u levnějších 60 Hz monitorů. Pokud VSync ve hře zapnete, úplně zapomeňte na nějaké úspěchy v rychlých střílečkách a budování vašeho skillu.
Vertikální synchronizace se zapíná na potlačení tearingu („roztrženého“ obrazu), ale pro latence je to opravdu pohroma. Pokud vám tedy při hraní počítačových her vadí tearing obrazu, investujte raději do „rychlých“ monitorů s vysokou obnovovací frekvencí (120, 144, 240, 360 Hz) s podporou G-Sync a FreeSync. Nejlépe pak s obojím.
Game a Render latency
Tady je to trochu složitější a tak se pojďme nejdříve podívat, jak vlastně funguje spolupráce mezi CPU a GPU při hraní počítačových her. Pro lepší vysvětlení vše notně zjednoduším a omezím se zde pouze na práci CPU, GPU a Render queue. Jak už víme, Render queue je ve zkratce jakýsi zásobník předpřipravených snímků procesorem, ze kterého jsou následně snímky odesílány do GPU pro jejich vlastní vykreslení. Tento zásobník může obsahovat až tři předpřipravené snímky procesorem a zajišťuje, že je grafická karta stále vytížena, tedy i v době, kdy procesor z nějakého důvodu na čas práci na nových snímcích přeruší. Temnou stranou této fronty je však notný nárůst latencí, ale to si za chvilku ukážeme na příkladech.
Ideální stav
Ideální stav renderingu by byl takový, kdyby doba zpracování snímku byla stejná, jak na CPU, tak také na GPU.
V tomto případě by procesor po dokončení práce odeslal předpřipravený snímek přímo do grafické karty, která by ho okamžitě začala renderovat. Procesor by mohl okamžitě paralelně zpracovávat snímek další a mezi tím by ve stejném čase grafická karta renderovala na obrazovku snímek předešlý. A tak by to šlo neustále dokola.
CPU |
Frame 1 |
Frame 2 |
Frame 3 |
Frame 4 |
|
Render queue |
|
|
|
|
|
GPU |
|
Frame 1 |
Frame 2 |
Frame 3 |
Frame 4 |
Snímková frekvence je tak dána dobou zpracování snímku GPU nebo CPU (časy jsou shodné) a díky prázdné Render queue (CPU do ní nestíhá připravovat snímky do foroty) je pak latence daná součtem časů přípravy snímku na CPU a jeho renderingu na GPU (frametime).
Příklad 1 |
CPU (příprava snímku) |
10 ms |
Queue (počet snímků) |
0 |
GPU (rendering snímku) |
10 ms |
Snímková frekvence |
100 fps (10 ms CPU i GPU) |
Lacence |
20 ms (10ms + 10ms) |
Vytížení CPU |
100 % |
Vytížení GPU |
100 % |
CPU bound
Vše ale ideální samozřejmě není a věřte, že se opravdu jen velmi zřídka stane, že by procesor předpřipravoval snímky stejnou rychlostí, jakou je pak renderuje grafická karta. Co se stane, když procesor dělá svou práci pomaleji nežli grafická karta?
Této situaci říkáme CPU bound, což značí, že výsledná snímková frekvence je dána výkonem procesoru, nikoliv grafické karty. Chcete-li si v této situaci polepšit na snímkové frekvenci, budete si muset pořídit výkonnější procesor a žádná ani ta sebevýkonnější grafická karta vám k tomu nepomůže.
CPU |
Frame 1 |
Frame 2 |
Frame 3 |
Frame 4 |
|
Render queue |
|
|
|
|
|
GPU |
|
Frame 1 |
idle |
Frame 2 |
idle |
Frame 3 |
idle |
Frame 4 |
idle |
S ohledem na latence pak díky tomu, že je procesor s přípravou snímku pomalejší, nežli doba renderingu grafické karty, Render queue zůstává opět „prázdná“ a latence je tak dána opět prostým součtem doby práce CPU a GPU. Grafická karta nebude plně vytížena, protože musí neustále čekat na dokončení práce procesoru.
Příklad 2 |
CPU (příprava snímku) |
10 ms |
Queue (počet snímků) |
0 |
GPU (rendering snímku) |
5 ms |
Snímková frekvence |
100 fps (10 ms na CPU) |
Lacence |
15 ms (10ms + 5ms) |
Vytížení CPU |
100 % |
Vytížení GPU |
50 % |
Snížení latence v tomto scénáři můžete pak dosáhnout, jak pomocí zkrácení doby přípravy snímku na straně CPU (upgrade za výkonnější CPU), tak také zkrácením doby renderingu snímku na GPU(upgrade za výkonnější GPU nebo snížením náročnosti hry v jejím nastavení).
GPU bound
Třetím a posledním případem je, když grafická karta renderuje snímky pomaleji, nežli je připravuje procesor. Této situaci říkáme GPU bound, protože snímková frekvence je dána výkonem GPU, a do hry se zde dostává také Render queue, do kterého procesor ukládá předpřipravené snímky do foroty (maximálně však 3).
Snímková frekvence je dána dobou renderingu na GPU, tedy jeho výkonem, a sebelepší procesor vám v tomto případě k vyšší snímkové frekvenci nepomůže.
CPU |
idle |
Frame 3 |
idle |
Frame 4 |
idle |
|
Render queue |
Frame 2 |
|
Frame 3 |
|
Frame 4 |
|
|
Frame 1 |
Frame 2 |
Frame 3 |
Frame 4 |
GPU |
|
Frame 1 |
Frame 2 |
Frame 3 |
Na rozdíl od scénáře CPU bound, kdy se v pipeline pohybovaly pouze dva snímky (na CPU a GPU), se nám v tomto scénáři pipeline rozrostla ještě o další tři snímky v Render queue. Z pohledu latence se tak jedná o součet doby práce na CPU a doby práce GPU násobený počtem předpřipravených snímků v Render queue (snímek, který se dostane do fronty jako poslední, totiž musí čekat, dokud se nevyrenderují všechny snímky ve frontě před ním). Plně vytížená je zde grafická karta, naopak procesor po zaplnění Render queue vytížen příliš není.
Příklad 3 |
CPU (příprava snímku) |
5 ms |
Queue (počet snímků) |
3 |
GPU (rendering snímku) |
10 ms |
Snímková frekvence |
100 fps (10 ms na GPU) |
Lacence |
45 ms (5ms + (3 x 10ms) + 10ms) |
Vytížení CPU |
50 % |
Vytížení GPU |
100 % |
Snížení latence se nám v tomto scénáři poněkud komplikuje, protože zde vstupuje do hry také Render queue, tedy ten největší "žrout" latence. Latenci tak můžeme snížit opět na straně CPU (výkonnější procesor) a na straně GPU (výkonnější GPU nebo snížením náročnosti hry v jejím nastavení), ale co s tou Render queue? Vy s tím v zásadě mnoho dělat nemůžete a do hry zde vstupují další nástroje, které se vlastně nesnaží o nic jiného, nežli o eliminaci právě Render queue (když říkám eliminaci queue, nemyslím tím její zákaz, ale postarání se o to, aby se zbytečně nanaplňovala). A právě tyto nástroje si představíme v následující kapitole.
Povšimněte si, že ve všech výše uvedených příkladech zůstává snímková frekvence stejná (100 fps) a jediné co se mění, je systémová latence. Díky zaplněné Render queue jsou pak latence v situaci GPU bound absolutně nejvyšší. Jak tedy můžete vidět, na různých fórech a různými geeky toliko odsuzovaný scénář CPU bound, kdy procesor nestíhá připravovat snímky grafické kartě a ta je pak nevytížena, není z pohledu latence scénářem vůbec špatným! V každém případě ale můžeme konstatovat, že ukazatel snímkové frekvence sám o sobě nepopisuje kvalitní hraní počítačových her dostatečně! Však hnedle uvidíte.
Jaká je tedy vlastně závislost latence na snímkové frekvenci? Pojďme se na to podívat. Předpokládejme, že CPU připravuje ve hře snímky konstatní rychlostí každých 5ms (200 fps) a my budeme postupně grafickou kartu nutit k vyšším výkonům, tedy kratším časům renderingu (frametime). Vypočítané latence pak zaneseme na osu Y a snímkovou frekvenci na osu X. Latence do grafu budeme zanášet hned dvě, jednak latenci s využitím Render queue a druhou pak bez využití této fronty.
Jak můžete vidět, spolu s vyšší snímkovou frekvencí nám postupně klesá latence, což asi pro vás není žádné překvapení. Co je však podstatné, tak to je onen ohromný vliv Render queue na výši latence. Například, máte dva hráče hrající hru při snímkové frekvenci 60 fps. Prvnímu hráči se povedlo eliminovat Render queue a hraje tak s latencí lehce nad 20ms. Druhý hráč, který se o tuto fronu nijak nepostaral, pak hraje s latencí něco nad 70ms, tedy s latencí více jak 3x vyšší, nežli jeho starostlivější protihráč. Na kterého hráče byste při hře vsadili vy? Dokonce si můžete povšimnout, že náš starostlivý hráč hraje s ještě nižší latencí, nežli další ostatní hráči, kterým ukazatel snímkové frekvence ve hře ukazuje třeba 100 fps (s využitím zásobníku). Takže takový je asi vliv Render queue na velikost latence a my se tedy pojďme nyní podívat na ty nástroje, které nám mohou s eliminací Render queue nějak pomoci.