Herní smyčka a snímková frekvence
Pokud víme, jak herní smyčka funguje, můžeme se nyní podívat na některé její aspekty.
Při každém průchodu herní smyčkou je vykreslen vždy jeden snímek scény a vy již asi tušíte, že se asi dostáváme ke snímkové frekvenci. Čím rychlejší je průchod herní smyčkou, tím více průchodů dosáhneme za jednotku času a protože v každém průchodu smyčky je vytvořen jeden snímek, budeme zároveň disponovat vyšší snímkovou frekvencí. Čím vyšší snímkové frekvence dosáhneme, tím také lépe (nebo kvalitněji) se nám daná hra bude hrát. Proč? Čím rychlejší jsou totiž průchody herní smyčkou, tím častěji jsou volány funkce Update a Draw. Stihne se tak jednak více uživatelských interakcí, ale také rozdíly v transformacích mezi jednotlivými snímky každého průchodu smyčkou nejsou tak výrazné a proto pohyb na obrazovce se jeví plynulejším.
Například, hrajete nějakou hru typu FPS (First Person Shooter), kde máte v centru obrazovky zobrazen nějaký zaměřovací kříž pro přesné zacílení vaší virtuální zbraně. Náhle se někde objeví nějaký ten padouch, kterého potřebujete rychle zneškodnit. Onen padouch je ale od vašeho zaměřovače vzdálen v obrazových jednotkách nějakých 800 pixelů a vy se tedy potřebujete rychle přemístit tak, aby zaměřovač mířil přesně na onoho padoucha a vystřelit. Řekněme, že tento váš přesun bude trvat jednu sekundu (ne, že bych vás měl za nemehla, ale ať se to lépe počítá), jinak padouch dostane zase vás. Zaměřovačem je tedy nutné se přemístit rychlostí 800 pixelů za 1 sekundu a my už můžeme počítat.
Pokud hra (herní smyčka) produkuje snímkovou frekvenci řekněme 20 FPS (20 snímků za sekundu), pak přesun zaměřovače je rozdělen do 20ti snímků. V každém snímku bude tedy zaměřovač posunut o 40 pixelů (800:20) doleva. Při snímkové frekvenci 60 FPS to bude už jen 13,3 pixelů (800:60), při snímkové frekvenci 80 FPS pak 10 pixel (800:80) a nakonec třeba při 120 FPS budou rozdíly transformace mezi snímky pouhých 6,6 pixelů. Samozřejmě tím nejideálnějším stavem plynulosti by byly transformační rozdíly mezi snímky v hodnotě 1 pixel, ale jaká by pak musela být snímková frekvence? To nechám na vás :-)
Nyní tedy víme, že hra je tím plynulejší, čím více dosáhneme průchodů herní smyčkou za jednotku času. Co nás tedy vlastně při průchodu herní smyčkou nejvíce zdržuje a snižuje tak snímkovou frekvenci? Pojďme se tedy na to podívat.
Ve funkci Update nás rozhodně nebude zdržovat čtení pozic polohovacích zařízení, to je jednoduché a rychlé. Horší už je to ale s výpočty transformací 3D objektů. Samozřejmě čím více a složitějších objektů ve scéně tím hůře. Hodně objektů, nebo složitější objekty znamená také více primitiv a vertexů, na které jsou transformace jako, třeba rotace (Rotation), posuny (Translation) nebo zvětšení/zmenšení (Scaling) aplikovány. Pokud se jedná o nějakou hru využívající také fyziku, pak se nám tyto transformace komplikují dále o výpočty třeba gravitace, zrychlení, tření atd. Ona také umělá inteligence nepřátel něco stojí a tak pokud vývojář nerozloží takovéto výpočty na více jader procesoru, věřte, že může být ouha a snímková frekvence herní smyčky může jít rychle dolů.
U vykreslování je to poměrně jasné, vlastní vykreslování snímku má na starosti 3D API společně s grafickou kartou a funkce Draw se tak stará „pouze“ o jeho přípravu (Setup). Podobně tedy jako ve funkci Update zde platí, čím více a složitějších objektů ve scéně, tím více práce musí být vykonáno a také více Draw Calls voláno.
Více Draw Calls pak následně více zahlcuje 3D API (API pipeline) a ve finále také více zatěžuje samotnou grafickou kartu. Jak vidíte, na vliv nižšího počtu průchodů herní smyčkou a tím i dosahování nižších snímkových frekvencí tak nemusí mít jen hra samotná, ale také nevýkonné 3D API (Overhead), či méně výkonná grafická karta.