Počítačové hry Herní engine 1 / 39
Obsah přednášky Co je Engine Herní smyčka Struktura enginu Hotové enginy 2 / 39
Literatura a odkazy http://gpwiki.org/index.php/game Engines http://en.wikipedia.org/wiki/game engine http://www.devmaster.net/engines/ Dalmau. Core Techniques and Algorithms in Game Programming. 2003 Zerbst, Duvel. 3D Game Engine Programming. 2004 Harbour. Game Programming All in One (2nd Edition). 2004 Eberly. 3D Game Engine Architecture: Engineering Real-Time Applications with Wild Magic. 2004 3 / 39
It is a mistake to think you can solve any major problems just with potatoes. -Douglas Adams 4 / 39
Co je engine? Je jádro interaktivní aplikace Má za úkol odstínit programátora-uživatele od systémových záležitostí poskytuje základní metody inicializace nahrání dat... ukončení Ulehčuje vývoj hry možnost znovuvyužití velkých kusů kódu v ideálním případě pouze změna dat přechod na jinou platformu 5 / 39
Co všechno engine nabízí? Záleží na kvalitě enginu 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 6 / 39
Aplikace v reálném čase Hry jsou časově závislé aplikace modul pro simulaci virtuálního světa AI fyzika... prezentační modul vstupní modul pro zjednodušení jen 3 - update světa a prezentace, vstup Každý z modulů je časově omezen co si s tím počít? 7 / 39
Aplikace v reálném čase Hry jsou časově závislé aplikace modul pro simulaci virtuálního světa AI fyzika... prezentační modul vstupní modul pro zjednodušení jen 3 - update světa a prezentace, vstup Každý z modulů je časově omezen co si s tím počít? Všechny moduly běží současně jak to ale zařídit? 7 / 39
Pokus první jednoduchá smyčka Jednoduchá smyčka update, pak prezentace oba moduly mají stejnou váhu while (! end ) { Vstupy Input () Update () Presentation () } Update Prezentace 8 / 39
Pokus první jednoduchá smyčka Jednoduchá smyčka update, pak prezentace oba moduly mají stejnou váhu while (! end ) { Input () Update () Presentation () } Výhody jednoduchost Vstupy Update Prezentace 8 / 39
Pokus první jednoduchá smyčka Jednoduchá smyčka update, pak prezentace oba moduly mají stejnou váhu while (! end ) { Input () Update () Presentation () } Výhody jednoduchost Problémy závislost na výkonu systému na rychlém stroji nehratelné na pomalém taky Vstupy Update Prezentace 8 / 39
Pokus druhý konstantní rychlost hry a závislé FPS Konstantní rychlost hry update, pak prezentace pokud zbývá čas, čeká se while (! end ) { Input () Update () Presentation () nexttime += 1000/ FPS sleeptime = nexttime - currtime ; Sleep ( sleeptime ); } Vstupy Update Prezentace Sync 9 / 39
Pokus druhý konstantní rychlost hry a závislé FPS Konstantní rychlost hry update, pak prezentace pokud zbývá čas, čeká se while (! end ) { Input () Update () Presentation () nexttime += 1000/ FPS sleeptime = nexttime - currtime ; Sleep ( sleeptime ); } Výhody jednoduchost Vstupy Update Prezentace Sync 9 / 39
Pokus druhý konstantní rychlost hry a závislé FPS Konstantní rychlost hry update, pak prezentace pokud zbývá čas, čeká se while (! end ) { Input () Update () Presentation () nexttime += 1000/ FPS sleeptime = nexttime - currtime ; Sleep ( sleeptime ); } Výhody jednoduchost Problémy na rychlém stroji čeká na pomalém stroji nestíhá Vstupy Update Prezentace Sync 9 / 39
Pokus třetí proměnné FPS a závislá rychlost hry Maximální rychlost diktovaná kreslením počítá se čas od posledního snímku while (! end ) { prevtime = currtime currtime = GetTime () Input () Update ( currtime - prevtime ) Presentation () } Vstupy Update Prezentace 10 / 39
Pokus třetí proměnné FPS a závislá rychlost hry Maximální rychlost diktovaná kreslením počítá se čas od posledního snímku while (! end ) { prevtime = currtime currtime = GetTime () Input () Update ( currtime - prevtime ) Presentation () } Výhody plynulejší v závislosti na rychlosti Vstupy Update Prezentace 10 / 39
Pokus třetí proměnné FPS a závislá rychlost hry Maximální rychlost diktovaná kreslením počítá se čas od posledního snímku while (! end ) { prevtime = currtime currtime = GetTime () Input () Update ( currtime - prevtime ) Presentation () } Výhody plynulejší v závislosti na rychlosti Problémy spousta Vstupy Update Prezentace 10 / 39
Pokus čtvrtý - konstantní rychlost a maximální FPS Oddělení updatů a prezentace 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 () } Vstupy Update Prezentace 11 / 39
Pokus čtvrtý - konstantní rychlost a maximální FPS Oddělení updatů a prezentace 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 () } Vstupy Update Výhody stabilní rychlost Prezentace 11 / 39
Pokus čtvrtý - konstantní rychlost a maximální FPS Oddělení updatů a prezentace 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 () } Vstupy Update Výhody stabilní rychlost Problémy na rychlém stroji se zbytečně kreslí stejné snímky Prezentace 11 / 39
Pokus pátý konstantní rychlost a variabilní FPS 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 ) } 12 / 39
Pokus pátý konstantní rychlost a variabilní FPS 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 ) } Výhody plynulost pohybu podle rychlosti počítače konstantní rychlost hry 12 / 39
Pokus pátý konstantní rychlost a variabilní FPS 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 ) } Výhody plynulost pohybu podle rychlosti počítače konstantní rychlost hry Nevýhody nutnost interpolátoru 12 / 39
Paralelní smyčka Řešení podobné jako v předchozím případě zvlášť update zvlášť prezentace Nevýhody zajištění synchronizace problémy na 1 procesoru Výhody více času Vstupy Update Prezentace 13 / 39
Struktura enginu Hudba Audio engine Čas Síť Zvuky Fyzikální egine Detekce kolizí Script engine A.I. Souborový manager Správce paměti Update Stavový manager Prezentace GUI Renderer Animační engine Vstup Vstupní subsystém Scene manager 14 / 39
Herní logika Je zodpovědná za update světa Musí se starat o statický svět hráče pasivní prvky aktivní prvky 15 / 39
Statický svět Objekty, které jsou součástí světa, ale nemají definováno chování terén, zdi,... U rozsáhlých světů nelze rozumně udržovat vše 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) 16 / 39
Hráč Musí uchovávat a updatovat stav hráče 17 / 39
Hráč Musí uchovávat a updatovat stav hráče Vstup od uživatele klávesnice, myš, joystick,... abstraktní kontroler hra se nestará o čtení z konkrétních zařízení lze libovolně namapovat 17 / 39
Hráč Musí uchovávat a updatovat stav hráče Vstup od uživatele klávesnice, myš, joystick,... abstraktní kontroler hra se nestará o čtení z konkrétních zařízení lze libovolně namapovat Update stavu spuštění animace pro pohyb úprava pozice... 17 / 39
Hráč Musí uchovávat a updatovat stav hráče Vstup od uživatele klávesnice, myš, joystick,... abstraktní kontroler hra se nestará o čtení z konkrétních zařízení lze libovolně namapovat Otestování omezení geometrická omezení (detekce kolizí) logická omezení (skriptování) Update stavu spuštění animace pro pohyb úprava pozice... 17 / 39
Pasivní prvky Objekty s nadefinovaným chováním, bez vlastní inteligence dveře, krabice, poletující ptáci... Nutné udržovat konzistentní stav 18 / 39
Pasivní prvky Objekty s nadefinovaným chováním, bez vlastní inteligence dveře, krabice, poletující ptáci... Nutné udržovat konzistentní stav seřazení podle relevantnosti (graf scény, dělení prostoru) 18 / 39
Pasivní prvky Objekty s nadefinovaným chováním, bez vlastní inteligence dveře, krabice, poletující ptáci... Nutné udržovat konzistentní stav seřazení podle relevantnosti (graf scény, dělení prostoru) vyhodnocení modelu chování (dynamika, skriptování) 18 / 39
Pasivní prvky Objekty s nadefinovaným chováním, bez vlastní inteligence dveře, krabice, poletující ptáci... Nutné udržovat konzistentní stav seřazení podle relevantnosti (graf scény, dělení prostoru) vyhodnocení modelu chování (dynamika, skriptování) update stavu 18 / 39
Aktivní prvky Objekty s vlastní inteligencí nepřátelé (nebo spoluhráči) Nutné udržovat konzistentní stav 19 / 39
Aktivní prvky Objekty s vlastní inteligencí nepřátelé (nebo spoluhráči) Nutné udržovat konzistentní stav seřazení podle relevantnosti (graf scény, dělení prostoru) 19 / 39
Aktivní prvky Objekty s vlastní inteligencí nepřátelé (nebo spoluhráči) Nutné udržovat konzistentní stav seřazení podle relevantnosti (graf scény, dělení prostoru) otestování stavu a vytyčení cílů (skriptování) 19 / 39
Aktivní prvky Objekty s vlastní inteligencí nepřátelé (nebo spoluhráči) Nutné udržovat konzistentní stav 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í) 19 / 39
Aktivní prvky Objekty s vlastní inteligencí nepřátelé (nebo spoluhráči) Nutné udržovat konzistentní stav 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) 19 / 39
Aktivní prvky Objekty s vlastní inteligencí nepřátelé (nebo spoluhráči) Nutné udržovat konzistentní stav 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 19 / 39
Struktura herní logiky // static world PreselectActiveZone () // player update ReadControls () ComputeRestrictions () UpdatePlayerState () // passive objects SortAccordingRelevance () ExecuteConstrolMechanism () UpdatePassiveObjectsState () // active objects SortAccordingRelevance () SenseInternalStateAndGoals () ComputeRestrictions () MakeDecision () UpdateActiveObjectsState () 20 / 39
Prezentace scény Tvoří podstatnou část hry stará se o to, aby byl hráč vtažen do hry Musí zajistit prezentaci 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ů vizuální audio taktilní... 21 / 39
Statický svět Stará se o vykreslení statického světa a objektů s jednoduchou animací 22 / 39
Statický svět Stará se o vykreslení statického světa a objektů s jednoduchou animací výběr relevantní části světa ořezávání odstranění odvrácených částí zakrytí 22 / 39
Statický svět Stará se o vykreslení statického světa a objektů s jednoduchou animací výběr relevantní části světa ořezávání odstranění odvrácených částí zakrytí výběr vhodného rozlišení (LOD) 22 / 39
Statický svět Stará se o vykreslení statického světa a objektů s jednoduchou animací výběr relevantní části světa ořezávání odstranění odvrácených částí zakrytí výběr vhodného rozlišení (LOD) příprava geometrie 22 / 39
Statický svět Stará se o vykreslení statického světa a objektů s jednoduchou animací výběr relevantní části světa ořezávání odstranění odvrácených částí zakrytí výběr vhodného rozlišení (LOD) příprava geometrie vykreslení 22 / 39
Aktivní objekty Stará se o vykreslení objektů s komplexní animací objekty postavy (NPC) Musí zajistit 23 / 39
Aktivní objekty Stará se o vykreslení objektů s komplexní animací objekty postavy (NPC) Musí zajistit výběr relevantních objektů 23 / 39
Aktivní objekty Stará se o vykreslení objektů s komplexní animací objekty postavy (NPC) Musí zajistit výběr relevantních objektů výběr vhodného rozlišení animování 23 / 39
Aktivní objekty Stará se o vykreslení objektů s komplexní animací objekty postavy (NPC) Musí zajistit výběr relevantních objektů výběr vhodného rozlišení animování příprava geometrie 23 / 39
Aktivní objekty Stará se o vykreslení objektů s komplexní animací objekty postavy (NPC) Musí zajistit výběr relevantních objektů výběr vhodného rozlišení animování příprava geometrie vykreslení 23 / 39
Hráč Speciální případ NPC většinou není nutné testovat zda je či není viditelný Malé zjednodušení 24 / 39
Hráč Speciální případ NPC většinou není nutné testovat zda je či není viditelný Malé zjednodušení (výběr vhodného rozlišení) animování 24 / 39
Hráč Speciální případ NPC většinou není nutné testovat zda je či není viditelný Malé zjednodušení (výběr vhodného rozlišení) animování příprava geometrie 24 / 39
Hráč Speciální případ NPC většinou není nutné testovat zda je či není viditelný Malé zjednodušení (výběr vhodného rozlišení) animování příprava geometrie vykreslení 24 / 39
Struktura prezentace // static world SelectVisibleSubset () SelectResolution () PackGeometry () RenderWorld () // active objects SelectVisibleSubset () Animate () PackGeometry () RenderNPC () // player Animate () PackGeometry () RenderPlayer () 25 / 39
Záludnosti síťové hry Předchozí model se musí upravit pro jiného hráče jste NPC Při updatu hráče je odeslání změn na server Při updatu aktivních objektů zavedení speciální třídy UI síťové zprávy mapuje na objekty 26 / 39
Hotové enginy Vyrábění vlastního enginu od základu je příliš nákladné inspirace jinými enginy úpravy existujících enginů hotová řešení Výběr enginu záleží na mnoha aspektech licence a cena typ hry požadované moduly stabilita hw nároky požadovaný jazyk podpora 27 / 39
Vlastnosti Grafika Modely osvětlení Textury Speciální efekty Terény Animace LOD Částicové systémy 28 / 39
Vlastnosti Zvuk 3d zvuk Text to speech VoIP Streamování 29 / 39
Vlastnosti AI AI behaviour Boti Formace Fuzzy logika Line of Sight Zpracování přirozeného jazyka Hledání cesty Stavový automat Skriptování 30 / 39
Vlastnosti Fyzika Detekce kolizí Režimy pohybu Fyzikální vlastnosti Simulace dopravních prostředků Simulace tekutin Rag dolls 31 / 39
Vlastnosti Síťařina Počet hráčů Úroveň implementace Protokol Výkon Architektura Seznam serverů 32 / 39
Vlastnosti Platforma a HW požadavky Platforma CPU Paměťová náročnost Zvuk Grafika Síťové připojení 33 / 39
Vlastnosti Náročnost Počet polygonů Počet objektů Velikost textur Počet spuštěných skriptů Počet síťových klientů 34 / 39
Vlastnosti Dokumentace a podpora Úroveň dokončení Úroveň dokumentace Online help Ukázkové kódy Tutoriály Knihy Fóra Podpora 35 / 39
Vlastnosti Ladění Debugger Profiler Ladění za běhu Simulátor síťového prostředí 36 / 39
Vlastnosti Ostatní Nahrávání a přehrávání hry Instant replay Nahrávání a ukládání stavu hry Přehrávání videa Cut scenes... 37 / 39
Přehled enginů http://www.devmaster.net/engines Volné enginy OGRE Irrlicht Crystal Space Quake 3... Nízkonákladové enginy Torque Game Engine TV3D... Profi enginy Doom3 Havok... 38 / 39
Konec 39 / 39