30 FPS musí stačit každému

tl;dr: Článek má sloužit (nejen) jako univerzální odpověď do diskuzí u lživých či zavádějících článků ohledně významu snímkovací frekvence ve videohrách.

Předmluva

V tomto článku bych rád probral celou problematiku a k závěrům se dostal logickou cestou, aby nevznikl prostor pro špatné interpretace a celé to dávalo smysl. Bohužel to znamená nějaké odskoky bokem a hromadu textu. Pokusím se proto celý text rozdělit do několika kapitol a přidat odkazy na přeskočení některých ne tak zásadních částí, takže pokud vás nezajímají detaily, můžete je využít a přesunout se dál.

Také jsem se snažil vyhnout zbytečnému natahování textu zabíháním do některých ne tolik podstatných technických detailů a vysvětlil je zjednodušeně. Některé odborníky na dané téma to může tahat za oči, ale než mi to vpálíte do tváře, změřte se prosím na to, jestli podstata sdělení byla zachována.

Film versus hra

„Hodnoty FPS vyšší než 30 nenabízí takový filmový zážitek, jen se podívejte na film Hobit, kde byla dvojnásobná snímkovací frekvence terčem kritiky.“

Argument výše může na první pohled působit logicky, ale jde o typický příklad míchání jablek s hruškama – vysvětleme si rozdíl mezi hrou a filmem.

Film

Asi víte, že dojem pohybu je u filmu vytvářen rychlým promítáním jednotlivých obrázků, dříve zaznamenaných na filmovém pásu. U filmu se používá cca 24 snímků za sekundu. Proč? Je to dáno historicky. Jednotlivé snímky filmu jsou vlastně fotografie a (analogová) fotografie vzniká tak, že se světlocitlivý materiál filmu osvítí po určitou dobu světlem přicházejícím skrze objektiv a scéna se tak „vypálí“ na políčko. Aby byl snímek dostatečně kvalitní, je třeba, aby na políčko dopadlo určité množství světla. Když ho bude málo, bude snímek nezřetelný, a když moc, bude přesvícený. Přesvícení se dá zabránit snížením světelnosti objektivu, ale nedostatek světla je větší problém, musíte scénu buď víc nasvítit (všimněte reflektorů při natáčení filmů) nebo osvětlovat snímek delší dobu.

No a filmaři hledali takový počet snímků, aby obraz působil ještě plynule, ale snímek byl osvětlován co nejdéle – vyšlo jim z toho 24 FPS. (Ve skutečnosti hledali nejnižší možný počet snímků za sekundu, aby se na to ještě dalo dívat, protože více snímků za sekundu = větší spotřeba filmového pásu, který není zrovna levná záležitost). Dnes se sice natáčí digitálně, ale princip zůstává podobný.

Výsledkem je tedy hromada na sebe navazujících obrázků, kde každý zachycuje scénu po (a to je velmi důležité) celou 1/24 sekundy. Proletí-li tedy před kamerou míč takovou rychlostí, že celé zorné pole přeletí za právě za 1/24 sekundy, na příslušném políčku bude šmouha přes celý snímek – pro názornost: při zorném úhlu 60° (běžný zorný úhel na konzolích [zdroj]) je to míč letící rychlostí 60 km/h ve vzdálenosti 0,7 m od pozorovatele (fotbalisti kopou i 150 km/h [zdroj]).

Míč rozmazaný přes celý snímek (obrázek není dokonalý, nejsem grafik, ale pro představu poslouží)(Ve skutečnosti by to vypadalo jinak, ale nejsem dobrý grafik)

Pokud byl letěl poloviční rychlostí, dostaneme dva snímky se šmouhou přes půl snímku, ale ani na jednom nebude balón ostře (!). Kdyby letěl třetinovou máme šmouhu přes třetinu atd. Důležité je, že nikdy nedostaneme ostré snímky zachycující pohyb.

Hra

Pohyb ve hře se skládá také z jednotlivých obrázků, které generuje program (engine). Na rozdíl od filmu ale tyto jednotlivé obrázky nezachycují dění za určitý čas, nýbrž ukazují stav zobrazované scény v určitém čase. A počet snímků za sekundu je omezen z jedné strany rychlostí zobrazovače (viz kapitola) nebo nastavením programu a z druhé rychlostí HW – čím rychleji je schopen vyrenderovat snímek, tím více jich dostaneme a tím více FPS dosáhneme.

Všechno, co se děje ve hře nejede plynule (spojitě), ale děje se ve skocích (diskrétně). Když jsou tyto kroky dostatečně malé, vytváří se iluze plynulosti. Důležité je, že každý snímek je zachycením statické a dokonale ostré scény však si udělejte screenshot (rozmazání se věnuje podkapitola). Kdyby byla hra film, jedno políčko by představovalo 1/nekonečno sekundy, což by bylo super, kdyby se nám jich přehrálo nekonečno za vteřinu – obraz by byl dokonale plynulý, ale také bychom potřebovali nekonečně rychlý počítač. Jenže to ve skutečnosti to vypadá tak, že zobrazujeme jen pár z těchto nekonečna snímků za sekundu. Ostatní neexistují.

Kdybychom měli stejný míč letící ve stejné vzdálenosti stejnou rychlostí jako v příkladu u filmu (60 km/h; 0,7 m od nás) a hra jela ve stejné snímkovací frekvenci (24 FPS), blikne nám někde na monitoru během 1/24 sekundy. Pokud by frekvence byla 30 FPS, blikne jednou uprostřed, nebo dvakrát (vždy u jiného kraje) na 1/30 s. Při 60 FPS blikne dvakrát nebo třikrát na 1/60 s atd.

Snímek ve hře

Čím více snímků za sekundu, tím víckrát a na kratší čas by se nám objevil a mozek by tento pohyb bral jako souvislejší.

Rozmazání a další triky

Pozn. Tuto kapitolu lze přeskočit, vysvětluje některé technické detaily, ale pro pochopení problematiky není úplně zásadní.

Stejně jako u filmu doporučuji si vytípnout obrázek ze hry, aby bylo vidět, že scéna je statická a ostrá. Nemusí to tak být ve všech případech, v poslední době se v hrách využívá rozmazání obrazu, aby pohyb vypadal plynule i při nízkých FPS. Pro některé je to ultimátní argument obhajující nízké snímkovací frekvence pro dojem filmovosti. Bohužel toto rozmazání není všespásné. Ptáte se proč? Tak se mi to líbí!

Jak jsme se řekli dříve, ve hrách se všechno děje po skocích. Pokud bychom chtěli dosáhnout 100% filmového vzhledu, museli bychom mít hromadu snímků za sekundu a ty jednou za 1/FPS sekundy sloučit a zobrazit. Na to však nemáme výkon, budeme potřebovat nějaký trik. Scéna se většinou nepohybuje celá, takže stačí rozmazávat jenom něco. Když to uděláme chytře, můžeme na to potřebovat méně výkonu než na vyrenderování celého snímku a zachovat dojem plynulosti.

Například balón z předchozích příkladů. Zobrazí se nám na jednom snímku a pamatujeme si jeho polohu na snímku předchozím. Celý obraz necháme jak byl, jen oblast kudy míč přiletěl přeplácneme jeho rozmazaninou. Jde o celkem jednoduchý výpočet – vše je lineární. Ušetřili jsme hromadu výkonu, kterou bychom potřebovali na vykreslení celé scény při dvojnásobné frekvenci a přitom jsme docílili krásně filmového snímku.

To je bezva, co? Jenže zkusme další příklad: Máme kuličku, která před námi opisuje kruh určitou rychlostí. Řekněme, že zvládne obletět celý kruh za dobu jednoho snímku. Klasický film bude mít na snímku rozmazaninu ve tvaru kruhu (něco jako když ve tmě máváte doutnajícím klackem). Hra bez rozmazání bude mít tečku vždy v jednom bodě (mezi snímky urazí celý kruh, takže blikne na stejném místě). A hra rozmazávaná stejným způsobem jako v předchozím příkladu zobrazí… počkejte si na to… úplně to samé! Proč? No, známe polohu kuličky na minulém snímku a na současném, tak kde ji chcete rozmazávat?

Ano, je několik způsobů jak to řešit. Pokud víme, že tam tak kulička lítá pořád dokolečka, můžeme jí prostě dát rozmazání natvrdo. Nebo můžeme počítat její polohu rychleji – řekněme na dvojnásobku FPS – pro každý snímek pak budeme mít dvě polohy, které mezi sebou rozmázneme – udělá nám to místo kruhu rovnou čáru mezi dvěma body – tudy cesta taky nevede. Tak co kdybychom si kromě polohy zaznamenali taky směr a velikost rychlosti a rozmazání provedli na tečné kružnici mezi těmito dvěma vektory (každá křivka se dá nahradit hromadou oblouků a přímka je kružnice o nekonečném průměru). Bingo, vykreslilo nám to krásné filmově rozmazané políčko! Jenže ouha počítání kruhového rozmazání je daleko (!) náročnější než lineární (přímé), grafické kartě to trvalo déle a místo 30 FPS jsme na 15, kde to ani sebelepší rozmazání nezachrání.

Takže ano, v některých případech jako je rychlý přímočarý pohyb, nebo rozmazání celé scény při rozhlížení (to je taky lineární) můžeme za relativně málo výkonu získat hodně muziky, ale jindy je lepší vykreslit místo jednoho rozmazaného snímku čtyři nerozmazané a dosáhneme lepšího výsledku. A to i ohledně tzv. input lagu, který je u her zásadní.

Vysvětlili jsme si, jaký je rozdíl mezi snímaným filmem a renderovanou (herní grafikou) a je na čase vrátit se k citátu ze začátku kapitoly. Proč se někomu nelíbil Hobit v 48 FPS, když u her je vyšší FPS lepší? Odpovědí může být něco, čemu pracovně říkám syndrom HD porna. Jde o to, že někdy vám může vyšší kvalita pěkně zkazit zážitek. Například video s nižším rozlišením může skrýt mnoho rušivých až nepříjemných prvků (beďary na prdeli) a zkazit tak výsledný dojem. Vyšší snímkovací frekvence nejen, že odhalí některé nedokonalosti, které nám dříve zůstávaly skryté, ale taky způsobí, že pohyb ve filmu vypadá jinak a mozek na to není připravený a může se dostavit nevolnost (zvlášť pokud sledujeme velké plátno). Mozek něco vidí, vypadá to hodně reálně, ale ostatní senzory říkají, že to není pravda (může jít o lehčí formu kinetózy). Některé malé děti toto zažívají i při delším sledování televize. Je to hodně o zvyku.

Hry mají oproti filmu výhodu v tom, že hráč ovládá to, co se před ním děje, čímž se odbourává část problému a vyšší snímkovací naopak přispívá k lepší odezvě hry snižováním prodlevy ovladání. Tomu se věnuje kapitola o tzv. input lagu.

30 vs 60 – a proč ne 42?

Některé by mohlo zajímat, proč se tolik diskutuje 30 a 60 FPS, jako by jiná čísla ani neexistovala. Nuž, vysvětlíme. Opět musíme do historie. Do časů dávných, kdy byla objevena bedýnka s trubadúry (televize). Staré televize a CRT monitory zobrazovaly obraz tak, že proti stínítku (vnitřní strana zobrazovací plochy) byl vystřelován paprsek elektronů. Ten byl tak široký, že dokázal osvítit velikost jednoho pixelu (vím, že pixely sem moc nepatří, ale pro vysvětlení to stačí). A tento paprsek kmital vždy po řádcích od shora dolů. A celou obrazovku musel přejet tak rychle, aby oko/mozek nezaznamenal, že body už nesvítí. Součástka, která ovládala paprsek (vysokofrekvenční trafo) nebyla zrovna levná a aby se ušetřilo, bylo pro směrování paprsku ve svislém směru použito frekvence elektrické sítě. No a americká elektrická soustava má 60 Hz (v Evropě máme 50 Hz).

Jelikož počítače a standardy pro ně se rozvíjely především v Americe, byla tato hodnota obnovovací frekvence standardizování (hledejte NTSC). Tím se dostala podpora 60 Hz do počítačů. I když na počítačový CRT monitor je to žalostně málo a bolí z toho oči. A kvůli zachování zpětné kompatibility se 60 Hz přeneslo i na LCD displeje, které používáme dnes.

Jak to souvisí s FPS ve hrách? Dostaneme s k tomu, ale nejdřív si vysvětlíme pojem tearing.

Tearing je chyba v obrazu, která vzniká při nesynchronizaci mezi výstupem z grafické karty a obnovovací frekvencí monitoru. Není to tak hrozné, pamatujete na CRT monitory, jak tam lítal paprsek a po řádcích vykresloval obraz? I u dnešních LCD to funguje podobně. Body jsou postupně vykreslované po řádcích odshora dolů nejčastěji 60x za sekundu (60 Hz, některé herní monitory umí i víc). Pokud monitoru dodáváme snímky vždy na začátku vykreslovacího cyklu, je vše v pořádku. Ale když mu je dodáme v průběhu, začne nový snímek ihned vykreslovat.

Představme si příklad s letícím míčem. Zrovna máme snímek, kde se nachází uprostřed scény a monitor zrovna začíná vykreslovat vlevo nahoře. Vykresluje, vykresluje a už se dostal do poloviny snímku (řekněme, že míč je uprostřed). Jenže máme rychlý HW a grafická karta nám už stihla vypočítat další snímek, kde je míč u kraje. Monitor nám ho tedy začne vykreslovat. Až doběhne na konec svého cyklu (vpravo dolů), máme v horní polovině obrazovky míč uprostřed a ve spodní na kraji. Tomu se říká tearing.

Zabránit tearingu se dá (HW řešení jako nVidia gSync vynechám – televize to stejně neumí) tak, že nebudeme monitoru dávat snímky v průběhu vykreslovacího cyklu. Vždy jen na začátku. Ideálně tedy když na každý cyklus dostane jeden snímek. Chvíle počítání a máme 60 FPS. Nebo, když nestíháme renderovat, můžeme nechat jeden snímek zobrazený přes dva obnovovací cykly… 30 FPS. Nebo přes tři = 20 FPS, jenže 20 FPS připomíná spíš promítání fotek než plynulý pohyb, takže pokud nechceme tearing, musíme se vejít do těchto dvou frekvencí. V PC hrách se o to stará nastavení vertikální synchronizace.

Prodleva v ovládání – input lag

Možná se vám někdy stalo, že hra (telefon, Windows…) sice běžela, ale přesto reagovala zpomaleně. Gratuluji, měli jste čest s tzv. input lagem česky prodlevou ovládání. Jde o dobu, která uběhne mezi stisknutím tlačítka a provedením příslušné akce na monitoru. Tuto prodlevu ovlivňuje několik faktorů a nikdy se jí nezbavím, můžeme ji jen minimalizovat.

U typické PC hry to funguje nějak takto: Nejprve dojde ke stisknutí tlačítka, elektronika v ovladačí (klávesnici/myši/gamepadu) jej zakóduje a pošle do počítače. Tam je dekódován a předán systému. Systém jej předá enginu a ten vyhodnotí akci a její vliv na hru. Je vypočítaná scéna odeslaná na render. Grafická karta scénu vyrenderuje a pošle na monitor, kde signál přelouská elektronika monitoru a začne vykreslovat (po řádcích).

Pokud máte bezdrátové periferie přičtěte si čas potřebný k zakódování a dekódování bezdrátového signálu a pokud je zobrazovadlem televize s funkcí vylepšení obrazu, tak ještě čas potřebný pro tuto úpravu relativně pomalou elektronikou televize (proto mají televize většinou herní mód, který tyto věci vypíná).

Jak vám asi došlo, dobu nutnou pro dekódování obrazu monitorem, a zpracování signálů v ovladači, jejich přenosem a dekódováním na straně počítače (konzole je taky počítač). Nemáme moc šanci ovlivnit, ty může považovat za stálé. Co ale můžeme ovlivnit (dobře, my ne, ale vývojáři) je zpoždění na straně enginu. A nemusím snad zdůrazňovat, že vyšší snímkovací frekvence má jen pozitivní vliv.

Například v závodní hře při rychlosti 200 km/h je vzdálenost, kterou auto urazí mezi snímky při 30 FPS téměř dva metry (1,85), při 60 FPS už jen (0,93). Ale abych byl fér, pokud máte brzdu někde cestou (hlavně televize), můžou se rozdíly v odezvě dost snížit. (Plynulost obrazu bude samozřejmě vyšší v druhém případě.)

Pár slov závěrem

Pokud jste se prokousali až sem, gratuluji. Už snad chápete, že kecy o filmových 30 FPS jsou jen výplod chorého (vychcaného) mozku kravaťáka zakrývající špatnou optimalizaci her či nedostatečný výkon konzolí. A je smutné, jak tyto lživé výroky nedostávají žádnou zpětnou vazbu z řad herních magazínů, kteří by (dle mého) měli nad svými chlebodárci – čtenáři (pokud tedy říkají pravdu a nejsou na výplatní pásce vydavatelů) držet ochrannou ruku. O tristním stavu (českých) herních magazínů se možná rozepíšu někdy v budoucnu.

Doufám, že tento článek pomůže k osvětě v tomto tématu a budu rád, když se jej nebudete bát použít v boji s nesmysly na toto téma.

PS: Netvrdím, že 30 FPS je nepoužitelných. Několik her jsem dohrál i tak, že jsem se na toto číslo nedostal a užil jsem si je, jen odmítám souhlasit s tím, že méně FPS je lepších.

PPS: Webová aplikace pro porovnání pohybu při různých snímkovacích frekvencích (na některých HW a prohlížečích nemusí být průkazné) – Compare frames per second: which looks better?

PPPS: Kdybyste věděli jak udělat ilustrační obrázky k dalším popisovaným vědcem, dejte vědět.