Počítačové hry Herní engine
Obsah přednášky
I
Co je „Engineÿ
I
Herní smyčka
I
Struktura enginu
I
Hotové enginy
Literatura a odkazy
I http://gpwiki.org/index.php/Game Engines I http://en.wikipedia.org/wiki/Game engine I http://www.devmaster.net/engines/
I Dalmau. Core Techniques and Algorithms in Game Programming. 2003 I Zerbst, Duvel. 3D Game Engine Programming. 2004 I Harbour. Game Programming All in One (2nd Edition). 2004 I Eberly. 3D Game Engine Architecture: Engineering Real-Time
Applications with Wild Magic. 2004
”It is a mistake to think you can solve any major problems just with potatoes.” -Douglas Adams
Co je engine?
I I
Je jádro interaktivní aplikace Má za úkol odstínit programátora-uživatele od systémových záležitostí I
poskytuje základní metody I I I I
I
inicializace nahrání dat ... ukončení
Ulehčuje vývoj hry I
možnost znovuvyužití velkých kusů kódu I
I
v ideálním případě „pouzeÿ změna dat
přechod na jinou platformu
Co všechno engine nabízí?
I
Záleží na kvalitě enginu I I I I I I I I I I I I
grafika 2D, 3D fyzika a kolize zvuk vstupy/výstupy skriptování animace umělá inteligence síťové záležitosti správa paměti reprezentace světa (scene graph) správa souborů GUI
Aplikace v reálném čase
I
Hry jsou časově závislé aplikace I
modul pro simulaci virtuálního světa I I I
I
prezentační modul vstupní modul
I
pro zjednodušení jen 3 - update světa a prezentace, vstup
I
I
Každý z modulů je časově omezen I
I
AI fyzika ...
co si s tím počít?
Všechny moduly běží současně I
jak to ale zařídit?
Pokus první – jednoduchá smyčka I
Jednoduchá smyčka I I
update, pak prezentace oba moduly mají stejnou váhu
while (! end ) { Input () Update () Presentation () } I
Výhody I
I
jednoduchost
Vstupy
Update
Prezentace
Problémy I
závislost na výkonu systému I I
na rychlém stroji nehratelné na pomalém taky
I Hra běží různě rychle na různých počítačích. V minulosti běžná praxe,
dnes velké rozdíly a nelze využít.
Pokus druhý – konstantní rychlost hry a závislé FPS I
Konstantní rychlost hry I I
update, pak prezentace pokud zbývá čas, čeká se
while (! end ) { Input () Update () Presentation () nextTime += 1000/ FPS sleepTime = nextTime - currTime ; Sleep ( sleepTime ); } I
Update
Prezentace
Výhody I
I
Vstupy
jednoduchost
Sync
Problémy I I
na rychlém stroji čeká na pomalém stroji nestíhá
I Pomalé počítače: dokud stíhají požadovanou frekvenci, je vše ok. Při
vysokých nárocích dochází k tomu, že se čas stává proměnný a to znepříjemňuje hru. I Rychlé počítače: hra by mohla běžet mnohem plynuleji, místo toho se
čeká.
Pokus třetí – proměnné FPS a závislá rychlost hry I
Maximální rychlost diktovaná kreslením I
počítá se čas od posledního snímku
while (! end ) { prevTime = currTime currTime = GetTime () Input () Update ( currTime - prevTime ) Presentation () } I
Výhody I
I
plynulejší v závislosti na rychlosti
Vstupy
Update
Prezentace
Problémy I
spousta
I Řešení trochu náročnější než předchozí (je nutné brát v potaz čas), ale
lépe využívá systém. I Pomalé počítače: pokud přijde náročnější scéna, výrazně spadne
framerate, což je nepříjemné kvůli odezvě. Horší je, že se to projeví i v AI a fyzice (kolize, nestability. . . ). I Rychlé počítače: protože je výpočet závislý na výkonu, může dojít při
velké rychlosti (velkém počtu iterací) k naakumulování chyby ve výpočtech (AI, fyzika) a následným neočekávaným efektům.
Pokus čtvrtý - konstantní rychlost a maximální FPS I
Oddělení updatů a prezentace I
update držet konstantní, prezentace kdykoliv je to možné
while (! end ) { loops = 0 while ( GetTime () > nextTime && loops < MAX_SKIP ) { Input () Update () loops ++ nextTime += 1000/ TPS } Presentation () } I
Výhody I
I
Vstupy
Update
Prezentace
stabilní rychlost
Problémy I
na rychlém stroji se zbytečně kreslí stejné snímky
I Čas se updatuje v konstantním čase, kreslení probíhá ve volných chvílích.
Podmínka loops < MAX SKIP se stará o to, aby se u pomalých počítačů kreslilo alespoň jednou za TPS/MAX SKIP. I Pomalé počítače: dochází k poklesu počtu snímků, pod kritickou hranicí
(= TPS/MAX SKIP) dochází ke zpomalení hry a neúnosně trhanému vykreslování. I Rychlé počítače: může docházet ke kreslení shodných snímků, hra běží
efektivně na maximálně TPS.
Pokus pátý – konstantní rychlost a variabilní FPS I
Využití inter/extrapolace pro větší plynulost animace while (! end ) { loops = 0 while ( GetTime () > nextTime && loops < MAX_SKIP ) { Input () Update () loops ++ nextTime += 1000/ TPS } interpolation = ( GetTime () + 1000/ TPS - nextTime )* TPS /1000 Presentation ( interpolation ) }
I
Výhody I I
I
plynulost pohybu podle rychlosti počítače konstantní rychlost hry
Nevýhody I
nutnost interpolátoru
Paralelní smyčka
I
Řešení podobné jako v předchozím případě I I
I
I
I
zvlášť update zvlášť prezentace
Nevýhody I
Vstupy
zajištění synchronizace problémy na 1 procesoru
Update
Výhody I
více času Prezentace
Struktura enginu Hudba
Audio engine
Čas
Síť Zvuky
Fyzikální egine Detekce kolizí
Update GUI
Script engine A.I.
Stavový manager Renderer
Souborový manager Prezentace
Animační engine
Správce paměti Vstup
Vstupní subsystém
Scene manager
Herní logika
I I
Je zodpovědná za update světa Musí se starat o I I I I
statický svět hráče pasivní prvky aktivní prvky
Statický svět
I
Objekty, které jsou součástí světa, ale nemají definováno chování I
I
terén, zdi, . . .
U rozsáhlých světů nelze rozumně udržovat vše I I
výběr aktivní části světa (graf scény, dělení prostoru) dynamické nahrávání světa (správa paměti, souborový systém)
Hráč
I I
Musí uchovávat a updatovat stav hráče Vstup od uživatele I I
klávesnice, myš, joystick, . . . abstraktní kontroler I I
I
Otestování omezení I I
I
hra se nestará o čtení z konkrétních zařízení lze libovolně namapovat
geometrická omezení (detekce kolizí) logická omezení (skriptování)
Update stavu I I I
spuštění animace pro pohyb úprava pozice ...
Pasivní prvky
I
Objekty s nadefinovaným chováním, bez vlastní inteligence I
I
dveře, krabice, poletující ptáci. . .
Nutné udržovat konzistentní stav I I I
seřazení podle relevantnosti (graf scény, dělení prostoru) vyhodnocení modelu chování (dynamika, skriptování) update stavu
Aktivní prvky
I
Objekty s vlastní inteligencí I
I
nepřátelé (nebo spoluhráči)
Nutné udržovat konzistentní stav I I I I I
seřazení podle relevantnosti (graf scény, dělení prostoru) otestování stavu a vytyčení cílů (skriptování) otestování omezení (detekce kolizí) rozhodnutí (umělá inteligence) update stavu
Struktura herní logiky // static world P r e s e l e c t A c t i v e Z o n e () // player update ReadControls () C o m p u t e R e s t r i c t i o n s () U p d a t e Pl a y e r S ta te () // passive objects S o r t A c c o r d i n g R e l e v a n c e () E x e c u t e C o n s t r o l M e c h a n i s m () U p d a t e P a s s i v e O b j e c t s S t a t e () // active objects S o r t A c c o r d i n g R e l e v a n c e () S e n s e I n t e r n a l S t a t e A n d G o a l s () C o m p u t e R e s t r i c t i o n s () MakeDecision () U p d a t e A c t i v e O b j e c t s S t a t e ()
Prezentace scény
I
Tvoří podstatnou část hry I
I
Musí zajistit prezentaci I I I
I
stará se o to, aby byl hráč vtažen do hry statického světa a jednoduchých pasivních objektů složitých pasivních objektů a aktivních objektů hráče
Prezentace může probíhat pomocí více kanálů I I I I
vizuální audio taktilní ...
Statický svět
I
Stará se o vykreslení statického světa a objektů s jednoduchou animací I
výběr relevantní části světa I I I
I I I
ořezávání odstranění odvrácených částí zakrytí
výběr vhodného rozlišení (LOD) příprava geometrie vykreslení
Aktivní objekty
I
Stará se o vykreslení objektů s komplexní animací I I
I
objekty postavy (NPC)
Musí zajistit I I I I I
výběr relevantních objektů výběr vhodného rozlišení animování příprava geometrie vykreslení
Hráč
I
Speciální případ NPC I
I
většinou není nutné testovat zda je či není viditelný
Malé zjednodušení I I I I
(výběr vhodného rozlišení) animování příprava geometrie vykreslení
Struktura prezentace
// static world S e l e c t V i s i b l e S u b s e t () S el e c tR es o lu ti on () PackGeometry () RenderWorld () // active objects S e l e c t V i s i b l e S u b s e t () Animate () PackGeometry () RenderNPC () // player Animate () PackGeometry () RenderPlayer ()
Záludnosti síťové hry
I
Předchozí model se musí upravit I
I
Při updatu hráče je I
I
pro jiného hráče jste NPC odeslání změn na server
Při updatu aktivních objektů I I
zavedení speciální třídy UI síťové zprávy mapuje na objekty
Hotové enginy
I
Vyrábění vlastního enginu od základu je příliš nákladné I I I
I
inspirace jinými enginy úpravy existujících enginů hotová řešení
Výběr enginu záleží na mnoha aspektech I I I I I I I
licence a cena typ hry požadované moduly stabilita hw nároky požadovaný jazyk podpora
Vlastnosti – Grafika
I
Modely osvětlení
I
Textury
I
Speciální efekty
I
Terény
I
Animace
I
LOD
I
Částicové systémy
Vlastnosti – Zvuk
I
3d zvuk
I
Text to speech
I
VoIP
I
Streamování
Vlastnosti – AI
I
AI behaviour
I
Boti
I
Formace
I
Fuzzy logika
I
Line of Sight
I
Zpracování přirozeného jazyka
I
Hledání cesty
I
Stavový automat
I
Skriptování
Vlastnosti – Fyzika
I
Detekce kolizí
I
Režimy pohybu
I
Fyzikální vlastnosti
I
Simulace dopravních prostředků
I
Simulace tekutin
I
Rag dolls
Vlastnosti – Síťařina
I
Počet hráčů
I
Úroveň implementace
I
Protokol
I
Výkon
I
Architektura
I
Seznam serverů
Vlastnosti – Platforma a HW požadavky
I
Platforma
I
CPU
I
Paměťová náročnost
I
Zvuk
I
Grafika
I
Síťové připojení
Vlastnosti – Náročnost
I
Počet polygonů
I
Počet objektů
I
Velikost textur
I
Počet spuštěných skriptů
I
Počet síťových klientů
Vlastnosti – Dokumentace a podpora
I
Úroveň dokončení
I
Úroveň dokumentace
I
Online help
I
Ukázkové kódy
I
Tutoriály
I
Knihy
I
Fóra
I
Podpora
Vlastnosti – Ladění
I
Debugger
I
Profiler
I
Ladění za běhu
I
Simulátor síťového prostředí
Vlastnosti – Ostatní
I
Nahrávání a přehrávání hry
I
Instant replay
I
Nahrávání a ukládání stavu hry
I
Přehrávání videa
I
Cut scenes
I
...
Přehled enginů I I
http://www.devmaster.net/engines Volné enginy I I I I I
I
Nízkonákladové enginy I I I
I
OGRE Irrlicht Crystal Space Quake 3 ... Torque Game Engine TV3D ...
Profi enginy I I I
Doom3 Havok ...