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. Každá entita herního světa je reprezentována instancí nějakého objektu. Mimoto obsahuje systém další objekty v herním světě neviditelné, které spolu interagují (datové struktury, zprávy, ...). Objekty jsou jednoznačně určeny svým identifikátorem, který je globální mezi všemi servery. Systém zaručuje pří vytváření objektu unikátnost jeho identifikátoru. Dále systém musí umět podle identifikátoru nalézt (co nejrychleji) server, kde se daný objekt právě nachází - je nutno počítat s přidáváním a odebíráním serverů a s přesunem objektů mezi servery.

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 bude 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 (Role-Playing) hrách (a nejenom v nich) je velmi častá 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 obsahují atributy, které budou implementované jako speciální C++ objekty, u kterých si server pamatuje čas posledního zápisu. Pro každý objekt bude existovat popis jeho vnitřní struktury, díky kterému bude systém schopen automaticky provádět jejich replikace a předávání na jiné servery. Bude také přesně vědět, které atributy replikovat, čímž se sníží 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ý download grafiky a podobných dat 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ý. Bude demonstrovat možnosti systému a měl by sloužit jako základ pro tvorbu někoho jiného.

Podporované platformy

Server bude vytvořen primárně pro Linux a Windows NT (2000, XP), klient pro Windows a Linux.

Lidské zdroje

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

Řešitelé: