Počítačová hra a herní smyčka
Počítačová hra je vlastně obyčejný program, běžící na procesoru, jehož páteří je takzvaná herní smyčka. Ta nejjednodušší herní smyčka obsahuje dvě základní funkce Update a Draw.
Update
Ve funkci Update jsou načteny stavy polohovacích zařízení, tedy určen pohyb myši, stisknutí klávesnice, načteny stavy gyroskopu (mobilní telefony) atd., aby se aplikace dozvěděla, jak a zdali vůbec uživatel (hráč) reagoval ve hře na dění na obrazovce. Pokud byla zjištěna nějaká interakce, znamená to, že uživatel (hráč) se ve 3D scéně nějak pohnul a je tedy potřeba provést nějakou tu transformaci objektů, které tuto scénu tvoří. Na základě údajů z polohovacího zařízení jsou tedy vypočítány a provedeny patřičné transformace na všech postižených 3D objektech. Pokud funkce Update svou práci dokončí a transformace jsou provedeny, běh aplikace je předán funkci Draw.
Draw
Hlavním úkolem funkce draw je vlastní vykreslení scény. Ale cožpak může samotná aplikace (hra) komunikovat přímo s monitorem PC a něco na něm zobrazovat? No, teoreticky ano, ale věřte, že takovou hru byste opravdu hrát nechtěli. K zobrazování a komunikaci s monitorem slouží ve vašem PC speciální kousek hardware s názvem grafická karta (óóó, jaké to překvapení). Aplikace tedy musí pro zobrazení scény komunikovat s grafickou kartou, bohužel, ale i toto má jeden háček. Počítače nejsou konzole a jejich útroby tedy mohou obsahovat grafické karty různých výrobců, s různým vybavením, různými funkcemi a rozdílnými instrukčními sety. Je jasné, že asi jen velmi těžko by mohl vývojář uzpůsobovat hru pro každý typ grafické karty zvlášť, takže bylo zapotřebí mezi aplikaci a grafickou kartu vložit ještě jednu mezivrstvu, která by se s těmito rozdílnostmi kompatibility vypořádala.
Jasně že, touto mezivrstvou jsou 3D API jako DirectX, OpenGL, Mantle, Vulkan, Metal atd. Aplikace tedy ve funkci Draw komunikuje výhradně s 3D API, které se pak následně postará o další kroky nezbytné k vykreslení scény na monitor počítače. Jak vidíte, začíná se nám to trochu komplikovat, ale vraťme se raději k funkci Draw.
Pro vykreslení objektu je tedy ve funkci Draw voláno 3D API, respektive některá z jeho vykreslovacích funkcí. Tato funkce zasílá prostřednictvím 3D API příkazy grafické kartě, co a jak má vykreslit na monitoru počítače. Společně s příkazy je tedy nutné zaslat také všechny parametry objektů k zobrazení, jako jsou geometrická data reprezentovaná vertexy jeho primitiv, které definují jeho tvar a umístění v prostoru. Geometrická data však ale nejsou jedinými daty, která objekty popisují. V případě „potažení“ ploch objektu texturou nebo barvou, je pak také nutné ukázat, kde se soubor s texturou v počítači nachází a jak je tato textura na plochu mapována, nebo definovat barvy a shadery, které mají být na plochu modelu aplikovány. Prostě, prostřednictvím 3D API se musí grafické kartě poslat úplně vše, co je potřeba ke správnému vykreslení objektu.
Můžeme tedy říci, že aplikace ve funkci Draw musí postupně procházet všechny objety umístěné ve viditelné části 3D scény (Frustrum), jejich primitiva a vytvářet seznam parametrů, které jsou použity jako vstupní hodnoty při volání vykreslovací funkce 3D API. Těmto voláním 3D API za účelem požadavku vykreslení objektu se říká Draw Calls a pro vytvoření celého finálního snímku jich může být voláno stovky, tisíce, desetitisíce a klidně i více.
Po vytvoření posledního Draw Calls snímku, je odeslán příkaz Present, který informuje o tom, že tvorba snímku byla dokončena a přikazuje snímek prezentovat - zobrazit na monitoru počítače. Zde je nutné zdůraznit jednu podstatnou věc. Po zavolání příkazu Present aplikace nečeká, až 3D API dopraví tento příkaz ke grafické kartě a ta snímek fyzicky vykreslí na monitor počítače, ale pokračuje dále, funkce Draw je ukončena a pomyslný štafetový kolík v naší herní smyčce je opět předán funkci Update.
Znamená to tedy, že zatímco grafická karta bude pracovat na fyzickém zobrazení snímku, herní smyčka aplikace již bude připravovat snímek další. Herní smyčka (CPU) a grafická karta (GPU) tedy pracují paralelně. Kam až tento paralelizmus může jít, tedy kolik snímků je možné dopředu herní smyčkou pro GPU vytvářet a jaký to má efekt na hraní počítačových her, o tom si povíme v dalších dílech.