Massiv (systém pro tvorbu online her)

Cíl projektu

V současné době dochází spolu s rozšiřováním internetu k rozvoji tzv. "online her". Jejich společným znakem je perzistentní svět, ve kterém se pohybuje větší množství aktivně připojených hráčů, jejichž počet může jít řádově do tisíců. Svět je simulován 24 hodin denně na jednom nebo více serverech, hráči se k nim mohou kdykoliv připojit. Po odpojení hráče se jeho postava většinou dění ve světě neúčastní, ale zachovává si svoje vlastnosti a majetek.

Cílem projektu Massiv je naprogramovat systém založený na architektuře klient-server, který by umožňoval herním vývojářům vytvářet právě takovéto online hry. Systém se bude skládat z několika komponent. Serverů, které simulují vlastní hru, starají se o správu účtů hráčů a zálohují herní data, a klientského software prezentujícího stav hry. Součástí projektu bude i demonstrační online hra.

Architektura systému

Distribuovanost

Hlavním problémem online her je nutnost plynule simulovat obrovský svět, po kterém se volně pohybují tisíce připojených hráčů a komunikují mezi sebou. To přináší pocit mnohem větší volnosti a reálnosti než skupina nezávislých arén pro pár lidí. Také ale rostou požadavky na výkon hardware, a proto je nutno zatížení rozložit mezi několik serverů. Každý potom simuluje určitou část světa a skupinu připojených hráčů.

Na rozdíl od standardních implementací podobných systémů nepočítáme s připojením všech serverů do rychlé lokální sítě, k takovému prostředí nejspíš nebudeme mít nikdy dlouhodobější přístup. Předpokládáme nasazení na serverech podobných těm, na kterých se dnes provozují neoficiální servery pro hry jako je Ultima Online, tedy středně výkonné stroje rozmístěné poměrně náhodně po světě. Proto při vzájemné komunikaci mezi servery nelze vyloučit velké latence. Na druhou stranu všechny současné online hry vykazují lokálnost - hráč vidí a dokáže ovlivňovat pouze omezenou část světa. Proto vhodné rozdistribuování a zvolení způsobu komunikace zaručí plynulost hry.

Objektovost

Systém je objektově orientován, přičemž herní svět je složen výlučně z objektů reprezentujících jednotlivé entity obsažené v něm, ať už hmotné (strom-smrk, části krajiny) nebo nehmotné (strom-binární strom, logika chování světa). Objekty jsou jednoznačně určeny svým identifikátorem.

Plocha světa je rozdělena na předem daný počet relativně malých sektorů. Každý server pak spravuje určitou podmnožinu, která nemusí být souvislá. Každý sektor je spravován právě jedním serverem. Ten je pak zodpovědný za simulaci objektů patřících geograficky do daného sektoru. Objekty mohou mezi servery migrovat, což je řízeno změnou jejich polohy ve světě. Vlastnictví sektorů servery se též může měnit. Systém by mohl umožňovat automatickou změnu vlastnictví sektorů podle zátěže komunikačních cest mezi servery, alespoň formou rady administrátorským postavám.

Objekty mezi sebou komunikují pomocí asynchronních zpráv. Vlastní zpráva je speciální objekt, který je předáván na cílový server (je určen na základě identifikátoru adresáta) stejnými mechanismy jako při migraci objektů.

V RPG hrách (a nejenom v nich) je velmi částá situace, kdy jeden objekt potřebuje číst data jiného objektu, ale nepotřebuje je modifikovat. Klasickám příkladem je umělá inteligence počítačem řízených postav, které pro volbu svého chování většinou zjistí stav svého okolí (čtením stavu okolních objektů) a podle zjištěné informace přejdou do jiného vnitřního stavu. Pro urychlení operací jako je čtení atributů vzdálených objektů (tj. těch, které vlastní jiný server), se používá replikace. Server si u sebe udržuje kopii vzdáleného objektu (tzv. repliku), vzdálené čtení je pak nahrazeno čtením hodnot lokální kopie, které se průběžně aktualizují. Vždy se však kopírují jen změněné atributy. Systém přestává repliku aktualizovat, pokud nebyly po určitou dobu zaznamenány žádné požadavky na čtení jejích dat. Pokud jsou sousední sektory vlastněné různými servery, zajistí systém v nutných případech replikace mezi sousedy, např. když objekt poblíž hranice zjišťuje, co "vidí" ve svém okolí.

Herní objekty budou implementovány jako C++ objekty odvozené ze speciální třídy tak, aby jim server rozuměl a mohl provádět jejich replikace a předávání na jiné servery automaticky. Systém si u každého atributu takového objektu pamatuje čas posledního zápisu, díky čemuž je schopen určit, které atributy replikovat, a tím se snižuje objem přenášených dat.

Další funkce serverů, zálohování

Kromě simulačních serverů bude systém obsahovat několik dalších typů serverů, které budou provádět:

Při výpadku libovolného serveru by se zbytek měl snažit pokračovat v simulaci, tedy např. předávání objektů může selhat a systém s tím musí počítat. Každý objekt musí být vždy v alespoň jedné "lokální" záloze, kterou si servery vytvářejí průběžně a nezávisle na sobě. Simulační server by se měl snažit o zotavení bez ovlivňování zbytku světa (zotavení z lokální zálohy), což samozřejmě může vést k nekonzistencím ve světě, které ale u méně důležitých objektů nemusí ve hrách vadit. To běžně u takovýchto her kontrolují hráči s vyššími právy (administrátoři, game masteři). V případě fatální chyby lze obnovit svět z globální zálohy (která se ale neprovádí tak často jako lokální). Důležité objekty, jako jsou postavy, se zálohují zvlášť a častěji.

Klient

Klient komunikuje vždy s jediným simulačním serverem. Servery si klienty mezi sebou předávají podobnými mechanismy jako normální objekty. Klient je pro simulační server jen dalším cílem replikací, kdy se replikuje aktuální oblast viditelnosti a slyšitelnosti. Události od klienta k serveru se řeší standardním zasíláním zpráv. Prezentace světa a uživatelské rozhraní je závislé na vlastní logice hry.

Demonstrační hra

Součástí projektu bude i demonstrační hra ve stylu RPG. S ní úzce souvisí konkrétní implementace částí serveru a klienta, přičemž některé by měly být více přenositelné do jiných her (systémové části), jiné méně (reprezentace světa, prezentační část klienta) a některé skoro vůbec (logika hry).

Server

Ve hře budou implementovány základní interakce se světem, jako jsou kolize objektů, braní a pokládání předmětů a komunikace mezi postavami. Herní systém bude umožňovat rozšiřování světa za běhu. Jedná se o rozšiřování mapy, změny již hotových částí, přidávání a úpravy vlastností objektů (zmutovaný obchodník prodávající dříve nevídané zboží, apod.). Nebudou chybět jednoduchá herní pravidla ve stylu RPG (vlastnosti postav, vylepšování, vybavování).

Klient

Jednoduchý grafický klient by měl umožňovat 3D zobrazení prostředí, objektů a postav pomocí OpenGL. Bude umožňovat dynamické downloadování grafiky a podobného obsahu na pozadí během hry, takže hráči s dostatečně kvalitním připojením stačí ke hře pouze spustitelné soubory. Pro snížení negativního vlivu latencí na pomalejších linkách bude klient provádět predikci (extrapolaci) pohybu viditelných objektů.

Svět

Vlastní svět (mapa, grafika, ...) pravděpodobně nebude nijak rozsáhlý. Měl by demonstrovat možnosti systému a být základem pro tvorbu někoho jiného.

Podporované platformy

Server podběží primárně na Linuxu, klient pod Windows. S největší pravděpodobností by server měl běžet i na Windows NT (2000, XP). Možná klient na Linuxu.

Lidské zdroje

Vedoucí projektu: Petr Tůma (petr.tuma@mff.cuni.cz)

Řešitelé: