02.02.2013 Views

Moja praca magisterska

Moja praca magisterska

Moja praca magisterska

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UniwersytetWarszawski<br />

WydziałMatematyki,InformatykiiMechaniki<br />

MichałSłapa<br />

Nralbumu:201095<br />

Architektura,projektirealizacja<br />

sieciowejgryakcjiczasu<br />

rzeczywistego<br />

Praca<strong>magisterska</strong><br />

nakierunkuINFORMATYKA<br />

grudzień2007<br />

Pracawykonanapodkierunkiem<br />

dr.JanuszaJabłonowskiego<br />

InstytutInformatyki


Oświadczeniekierującegopracą<br />

Potwierdzam,żeniniejsza<strong>praca</strong>zostałaprzygotowanapodmoimkierunkiemikwalifikujesiędoprzedstawieniajejwpostępowaniuonadanietytułuzawodowego.<br />

Data Podpiskierującegopracą<br />

Oświadczenieautora(autorów)pracy<br />

Świadomodpowiedzialnościprawnejoświadczam,żeniniejsza<strong>praca</strong>dyplomowa<br />

zostałanapisanaprzezemniesamodzielnieiniezawieratreściuzyskanychwsposób<br />

niezgodnyzobowiązującymiprzepisami.<br />

Oświadczamrównież,żeprzedstawiona<strong>praca</strong>niebyławcześniejprzedmiotemprocedurzwiązanychzuzyskaniemtytułuzawodowegowwyższejuczelni.<br />

Oświadczamponadto,żeniniejszawersjapracyjestidentycznazzałączonąwersją<br />

elektroniczną.<br />

Data Podpisautora(autorów)pracy


Streszczenie<br />

Wtokupracymagisterskiejmiałemokazjęspróbowaćwłasnychsiłwprzedsięwzięciu,jakim<br />

jesttworzenieodpostawwłasnejgrykomputerowej.Projektdałmiokazjędoprzyjrzenia<br />

siębliżejprogramistycznymaspektomelektronicznejrozrywkiizmierzeniasięzestawianymi<br />

przeznieproblemami.Poniższa<strong>praca</strong>powstałajakopodsumowaniemojegoprojektuima<br />

nanaceluprzedstawieniezarównoogólnejproblematykitworzeniaiprogramowaniagier<br />

komputerowychjakidokładniejsząanalizęwybranychzagadnieńznimizwiązanych.Wcałej<br />

pracyteoretycznejodnoszęsięnietylkododoświadczeńnabytychprzymagisterskimprojekcie<br />

realizowanymwramachtejpracy,alerównieżdodoświadczeńzawodowych,gdyżnacodzień<br />

jestemprogramistągier,dotychczaspracującymprawiedwalatanadniedawnozakończonym<br />

projektem“Wiedźmin:GraKomputerowa”.<br />

Słowakluczowe<br />

grakomputerowa,gradlawielugraczy,serwer<br />

11.3Informatyka<br />

Dziedzinapracy(kodywgprogramuSocrates-Erasmus)<br />

D.Software<br />

D.1ProgrammingTechniques<br />

D.1.mMiscellaneous<br />

Klasyfikacjatematyczna<br />

Tytułpracywjęzykuangielskim<br />

Architecture,designandimplementationofmultiplayeractiongame


Spistreści<br />

Wprowadzenie ....................................... 5<br />

0.1. Cel.......................................... 5<br />

0.2. Następnerozdziały................................. 5<br />

1. Tematykaprojektu .................................. 7<br />

1.1. Grakomputerowa.................................. 7<br />

1.1.1. Rynekgierkomputerowych ........................ 8<br />

1.1.2. Tworzeniegier-zespół .......................... 9<br />

1.1.3. Tworzeniegier-produkcja ........................ 10<br />

1.2. <strong>Moja</strong>gra ...................................... 11<br />

1.3. Grysieciowe..................................... 11<br />

1.3.1. Kierunkirozwojurozrywkisieciowej ................... 12<br />

2. Projekt.......................................... 15<br />

2.1. Założeniaprojektu ................................. 15<br />

2.2. MaelstormOnline ................................. 15<br />

2.3. Wpływwymagańprojektunaarchitekturęgry ................. 17<br />

2.4. Szerszakoncepcjagry ............................... 18<br />

3. Implementacja ..................................... 21<br />

3.1. Projektiśrodowisko ................................ 21<br />

3.1.1. Historiaprac ................................ 21<br />

3.1.2. Środowiskoiplatforma........................... 22<br />

3.1.3. Użytebiblioteki............................... 23<br />

3.2. Architekturaaplikacji ............................... 25<br />

3.2.1. Definicjaproblemu............................. 25<br />

3.2.2. Światgry .................................. 25<br />

3.2.3. Symulacja.................................. 28<br />

3.2.4. Synchronizacja ............................... 29<br />

3.2.5. Wnioski ................................... 32<br />

3.3. Implementacjawarstwysieciowej ......................... 34<br />

3.3.1. Wybórprotokołukomunikacyjnego.................... 34<br />

3.3.2. Serializacja ................................. 34<br />

3.3.3. Obsługapołączeń.............................. 36<br />

3.4. Dynamicznewykrywaniekolizji .......................... 37<br />

3.4.1. Kolizjeobiektów .............................. 37<br />

3.4.2. Kolizjezgeometriąświata......................... 39<br />

3.4.3. Wnioski ................................... 40<br />

3


3.5. Wyświetlaniegrafiki ................................ 41<br />

3.5.1. Interfejsmoduługraficznego........................ 41<br />

3.5.2. Animacja .................................. 42<br />

3.6. Pathfinding-wyszukiwanieścieżek ........................ 45<br />

3.6.1. Definicjaproblemu............................. 45<br />

3.6.2. Wydajność ................................. 47<br />

3.6.3. A*...................................... 47<br />

3.6.4. Automatycznypodziałpłaszczyzny.................... 48<br />

3.6.5. Pokoje.................................... 49<br />

3.6.6. Grafwidoczności .............................. 50<br />

3.6.7. Punktynawigacyjne ............................ 52<br />

3.6.8. Dodatkoweelementysystemuwyszukiwaniaścieżek........... 53<br />

3.6.9. Wnioski ................................... 56<br />

3.7. Algorytmstadaisztucznainteligencja ...................... 58<br />

3.7.1. Implementacja ............................... 58<br />

3.7.2. Wydajność ................................. 59<br />

3.7.3. Modyfikacjealgorytmu........................... 59<br />

3.7.4. Zastosowania ................................ 59<br />

3.7.5. Maelstorm.................................. 60<br />

3.7.6. Dołączonyprogramdemonstracyjny ................... 61<br />

3.8. Technikiprogramistyczne ............................. 63<br />

3.8.1. Alokacjapamięci .............................. 63<br />

3.8.2. Profilowaniekodu ............................. 64<br />

4. Podsumowanie ..................................... 67<br />

4.1. Wnioskidotycząceprojektu ............................ 67<br />

4.2. Testyaplikacji ................................... 68<br />

4.2.1. Warunkitechniczneprzeprowadzonychtestów.............. 68<br />

4.2.2. Wynikitestów ............................... 68<br />

4.2.3. Horyzontyrozbudowyprojektu ...................... 69<br />

A.Materiałydostarczonewrazzpracąmagisterską ............... 71<br />

Bibliografia ......................................... 73<br />

4


Wprowadzenie<br />

<strong>Moja</strong><strong>praca</strong><strong>magisterska</strong>podzielonajestnadwieczęści.Praktyczną,wzakresiektórejopracowałemsieciowągręczasurzeczywistego,skupiającsięprzedewszystkimnaopracowaniu<br />

uniwersalnegoiskalowalnegosilnikagry.Częśćteoretycznąpracystanowinatomiastniniejszy<br />

dokument,wktórymskupiamsięnaopisiezagadnieńzwiązanychztworzeniemgierkomputerowych,zktórymispotkałemsięprzedewszystkimwtokupracnadprojektem.Jednocześnie<br />

konfrontujętuzastosowaneprzezmnierozwiązaniaztymiodnalezionymiwliteraturze,lub<br />

zktórymimiałemdoczynienia,wtrakciepracyzawodowejnadniedawnowydanymtytułem<br />

“Wiedźmin:GraKomputerowa”[TW07].<br />

0.1. Cel<br />

Zadaniem,któreprzedsobąpostawiłem,podkątempracypraktycznej,byłostworzenieprototypusieciowejgrykomputerowej,wktórymmiałemzamiarzastosowaćwłasne,myślę,że<br />

ciekawerozwiązaniawkwestiiarchitekturyaplikacji.Zależałomiszczególnie,nastworzeniu<br />

wydajnejarchitekturyklientserwerodosyćnietypowymsposobiesynchronizacjisymulacjipo<br />

obustronach.Problemspójnościświatagrynakilkupołączonychmaszynachniejestbynajmniejbanalnyipierwszeszerokostosowanerozwiązaniazupełnienieskalowałysiędogier,w<br />

którychgraćmożewięcejniżmaksymalniekilkunastugraczy.Rozwiązania,któreprzyjąłem<br />

majązapewnićwydajnośćibezpieczeństwoaplikacjiserwera,umożliwićgręmożliwedużej<br />

liczbygraczy,asamaarchitekturaaplikacjimaułatwićrozbudowęizmianyprojektu.<br />

Jednocześniewteoretycznejczęścipracy,głównynaciskchciałempołożyćnaanalizęwybranych,najpopularniejszychaspektówprogramowaniagier.Zastanawiamsiętunadrozwiązaniamialgorytmicznymiiprojektowymi,opierającsięnawłasnychprzemyśleniach,literaturzeizaobserwowanychwpraktycerozwiązaniach.<br />

0.2. Następnerozdziały<br />

Pracaskładasięzczterechrozdziałówidodatku.Wrozdziale1przybliżamogólnieproblematykęidziedzinęprojektu.Wymaganiaiopisprojektuodstronykońcowegoużytkownika<br />

przedstawiamwrozdziale2.Sercemmojejpracyjestrozdział3,wktórymskupiamsięna<br />

zagadnieniachimplementacyjnychkonkretnychmodułówgry,zarównowkontekściemojej<br />

pracy,jakiprzyszerszymspojrzeniunaproblem.Nakońcuwrozdziale 4opisujęjakwidzę<br />

ewentualnyrozwójmojejaplikacjiorazpróbujęwyciągnąćzpracnadniąkońcowewnioski.Zamieszczamwnimrównieżwynikiprzeprowadzonychtestówwydajnościowychmojej<br />

aplikacji.<br />

5


Rozdział1<br />

Tematykaprojektu<br />

Moimprojektemmagisterskimjestprostagrakomputerowa 1 .Niemiałemwintencjiporywaniasięzmotykąnasłońceitworzeniakompletnegoorazrozległegoprojektu.Pisaniegier<br />

wymagaimplementacjiwieluróżnychmechanizmówibystworzyćprodukt,przykuwający<br />

odbiorcęnadługiegodzinykoniecznejestwykonanienietylkowielupracprogramistycznych<br />

nadsamągrą.Potrzebnejeststworzeniezestawunarzędzidoimplementacjimechanikigry,<br />

jejprojektiimplementacja,stworzeniegrafiki,dźwiękuiostateczniekoordynacjawszystkich<br />

tychelementów.Mogłemspróbowaćpracowaćnadwszystkimitymielementamijednakowoi<br />

stworzyćmały,zamkniętyprojekcikoniewielkichmożliwościachrozbudowy.Wolałemjednak<br />

stworzyćpewienszkieletgry,szczególniedopracowanyodstronyprogramistycznej.Interesuje<br />

sięgramijakoprogramista,dlategonajbardziejzależałominaimplementacjimocnegosilnika<br />

2 gry,szczególnieskupiającsięnaaspektachsieciowychorazwydajnościowychaplikacji<br />

serwera.Oczywiściewmojejpracymamyzarównotrójwymiarowągrafikęjakiprzyjemną,<br />

choćprostąrozgrywkęsieciową,jednaknienatopołożonybyłgłównynaciskwprojekcie.<br />

1.1. Grakomputerowa<br />

Skoromówimyogrzekomputerowej,czymonajestzpunktuwidzeniaprogramisty?<br />

Pisaniegryjesttworzeniempewnejsymulacjirzeczywistości.Jeślipopatrzymynagręjako<br />

program,tojejpodstawowymzadaniemjestsymulowaniepewnejwyspecyfikowanejabstrakcjiświata.Wrazzpostępemtechniki,abstrakcjatamożebyćcorazbardziejzbliżona,zarównodoświatarzeczywistego,jakifantastycznychświatówpowstałychwumysłachtwórców.Oczywiścienigdyniebędziemożliwezupełneodtworzenieświataimechanizmównimkierujących<br />

wgrze,dlategokoniecznebędązawszepewneuproszczeniaiprzybliżenia.<br />

Choćsymulacjanigdyniebędzie”dokładna”,możnazastanowićsię,czymiarą”jakości”<br />

gryjestmożliwiedokładneodwzorowanieprzezniąrzeczywistości.Napewnonadajetogrze<br />

realizmuiumożliwiawiększezaangażowaniesięgraczawprzedstawianyświat,alemoim<br />

zdaniemnietojestkwintesencjądobregoproduktu.Chodzijednakozabawę,odciągającąna<br />

kilkachwilodrzeczywistości.Tocopokazujemynaekraniepowinnobyćnietylerealistyczne,<br />

copoprostuładne,bynierazićgraczaprzyzwyczajonegodowysokiejjakościgrafiki.<br />

1 Grakomputerowa-rekreacyjnaaplikacja,będącaźródłemrozrywki.Zpowoduosobistegoprzyzwyczajenia,wtokupracynadużywamtegosformułowaniaodnoszącegosięzdefinicjidogierdziałającychnakomputerachosobistych.Prawidłowopowinienemużywaćokreśleniagrawideo.Pierwszegrywideo,topowstaław<br />

1958”TennisforTwo”iw1962”Spacewar!”.<br />

2 Silnikgry-implementacjakluczowejmechanikigrywideo,bądźinnejinteraktywnejaplikacjigraficznejczasurzeczywistego.Możeobejmowaćkluczowemechanizmygry,wtymsymulacjęświata,wyświetlanie,<br />

obsługędźwiękuifizyki,atakżemechanizmyzarządzaniazasobamioraznarzędziadoichedycji.<br />

7


Jeżeliwięcpopatrzymynagręjakonasymulacjęzauważymy,żenaszymzadaniemprzyjej<br />

tworzeniu,będziepróbanaśladowaniapewnychmechanizmówprzedstawianegoświata.Sposóbnaszegonaśladowaniatychmechanizmówtylkowniektórychprzypadkachbędzieopartynamodelufizycznym.Zwyklebędziemyopieraćsięnazupełnieniezależnychodniegorozwiązaniachiobserwacjach.Dobrymprzykłademjestnaprzykładmodeloświetleniawgraficekomputerowej.Próbamimikiprawrządzącychświatłemwprogramachkomputerowychwymagazbytdużejmocyobliczeniowejbybyłotowykonywanewczasierzeczywistym.Istniejątechnikiśledzeniapromieni(RayTracing),alekorzystasięznichwyłącznienapotrzebytworzeniastatycznychobrazów,bądźanimacji,którychgenerowaniepochłaniazbytdużoczasu,<br />

bymogłybybyćtworzonenabieżąco.Trójwymiarowagrafikakomputerowa,wyświetlanaw<br />

czasierzeczywistym,odpoczątkupowstawaławoparciuouproszczonemodeleoświetlenia<br />

(Lamberta,modelPonga)itechniki,któredobrzesprawdzałysięwpraktyce,jednaknie<br />

bazowałybezpośrednionarzeczywistychprawachfizycznych.<br />

Światmojejgryjestbardzoumowny,alenieoceniałemmojegosilnikapodwzględemtego<br />

jakrealistycznabędzieopartananimgra.Byumożliwićstworzenieprzyjemnejwodbiorze<br />

grywmoimsilnikuskupiłemsięnawłasnościachtakich,jakudziałmożliwiedużejliczby<br />

graczy,przyjednoczesnymzachowaniumodeluzręcznościowejgryakcji.<br />

1.1.1.Rynekgierkomputerowych<br />

Grykomputerowekojarząnamsięwszystkimgłówniezzabawą,trzebawięczastanowićsię,<br />

czymożnazajmowaćsięniminapoważnie.Początkirynkugierkomputerowychdatujesię<br />

napóźnelatasiedemdziesiąteibyłtowówczasniszowyrynekhobbistyczny,zyskującypopularnośćwrazzdostępnościąkomputerówosobistych.Jeszczewewczesnychlatachdziewięćdziesiątych,największehityniezbytjeszczeupowszechnionej,komputerowejrozrywkipowstawałyczęstorękamisamotnychtwórców.Wtychteżczasach,powstawałypierwszestudiazajmującesięprofesjonalnietworzeniemgierprzeznaczonychnakomputeryosobisteorazswojądziałalnośćrozpoczynalipierwsiwydawcy.Rynekrozwijałsięwrazzrozwojemsprzętukomputerowego,wdużejmierzezresztąsambyłmotoremtegorozwoju.Wciążwykazujeondużąniestabilność.Ciąglepowstająnowiproducenci<br />

gier,częstonazgliszczachtych,którymsięnieudało.Rynekjednakpowoliosiągadojrzałość,<br />

adochodyjakienotujepozwalająmujużkonkurowaćzprzemysłemfonograficznym.<br />

Elektronicznarozrywkazresztąjużodswoichpoczątkówmiałabardzodużywpływna<br />

rozwójinnychdziedzinprzemysłukomputerowego,szczególniesprzętu.Gryjakoaplikacje<br />

wykorzystującepełnąmockomputerówosobistychwymuszałyichrozwój,zktóregonastępnie<br />

korzyściczerpałyinnegałęzieprzemysłu.Pozasiłąprocesorów,miałyszczególnywpływna<br />

rozwójkartiakceleratorówgraficznych,kartdźwiękowych,czynapędówCD,choćwwypadku<br />

tychostatnichwciążkluczowąrolęodgrywałprzemysłmuzyczny,anastępniefilmowy.<br />

Zdoświadczeniawiem,żeprzynajmniejpolskirynekgierkomputerowychbardzopotrzebujedobrychprogramistów.Średniapłacajestniższaodtejjakąoferujesektorbankowy,a<br />

dotegoniestabilnośćrynkuodbijasięnegatywnienastabilnościzatrudnienia.Zuwagina<br />

wciążrosnącekosztyprodukcjideweloperzysącorazbardziejuzależnieniodwydawcówiczęstonawetsukcesyprzywydaniukilkutytułówmogąnieuchronićfirmyprzedupadkiemw<br />

następnychlatach.Dlategoczęstoludziepracującynadgramizmieniająfirmy.Rynekjest<br />

wciążwyraźnienienasycony,więcnaszczęścieniemaproblemówzeznalezieniemponownego<br />

zatrudnienia.<br />

Kolejnymproblememjestniejednolitośćzespołówprodukcyjnych.Tylkoniewielkąich<br />

częśćstanowiąprogramiści.W”Wiedźminie”naponadsiedemdziesięcioosobowyzespół,programistówzatrudnionychdopracynadgrąbyłookołodziesięciu.Ozbliżonychproporcjach<br />

8


słyszałemrównieżwodniesieniudoinnychprojektów.Dlategonarynkugier,choćinżynieria<br />

programowanianiewymagaodprogramistyumiejętnościdialoguzkońcowymklientem,musi<br />

onpotrafićznaleźćwspólnyjęzykwewłasnymzespole,wktórymrównorzędnymipartnerami<br />

sądlaniegoludzieniezwiązanizprogramowaniem.<br />

Warunkipracyprogramistynarynkuelektronicznejrozrywkisąprawdopodobniepowodem,dlaktóregowieluludziwybierasektorfinansowyalbousługowy.Rynekjednakistnieje<br />

iwykazujerosnącezapotrzebowaniemnanowychludzi.Oferujepracębynajmniejnielekką,<br />

aledlawielu,wtymdlamnie,ciekawąiwymagającąstawieniaczołaszerokiemuwachlarzowi<br />

problemówprogramistycznych.<br />

1.1.2.Tworzeniegier-zespół<br />

Jakjużwspominałemskalaprzedsięwzięciajakimjesttworzeniegrykomputerowejwrazz<br />

rozwojemrynkudiametralniesięzwiększyła.Hitypoczątkulatdziewięćdziesiątychtakiejak<br />

nieśmiertelny”PrinceofPersia”(1989),czy”AnotherWorld”(1991)stworzonebyłyprzez<br />

samotnychprogramistów.Istniałyjużpierwszezespołydeweloperskie,alebyłyzłożonyz<br />

kilkuosób.Wrazzrozwojemkomputerówosobistychrozwinąłsięrynek,wrazzrynkiem<br />

zapotrzebowanienakomputerowąrozrywkę.Wrazzzapotrzebowaniem-zespołypowiększyły<br />

sięiwyspecjalizowały.<br />

Wchwiliobecnejliczebnośćzespołupracującegonadjednągrąjestróżnawzależnościod<br />

klasypowstającejprodukcji.Istniejągrystworzonewciągukilkumiesięcy,nagotowymsilniku.Wichpowstaniebezpośredniozaangażowanychbyłokilkuprojektantówpoziomów,grafikówipojedynczyprogramista,właściwierealizującytylkobieżącezapotrzebowaniazespołu.<br />

Nadnajwiększymiprodukcjamizaangażowanesąrzeczywiściedużezespoły,naprzykładnad<br />

grą”GTA4”wRockstarGamespracujeokołostupięćdziesięciuosób.Przy”Wiedźminie”<br />

pracekoncepcyjnerozpoczęłysięwkilkuosobowymzespole,abypolatachwdecydującej<br />

fazie,nadprojektembyłozatrudnionychponadsześćdziesiątosób.Wostatnimokresprac,<br />

przedwydaniemgry,zespółjeszczesiępowiększyłdowspomnianychwyżejsiedemdziesięciu<br />

osób.Dodatkowobyłaprowadzonawspół<strong>praca</strong>zzewnętrznymidziałamikontrolijakości.Oddzielnefirmyteżtworzyłyczęśćtrójwymiarowychmodelipostaciorazobiektówotoczenia,a<br />

takżeanimowanesekwencjefilmowerozpoczynająceikończącegrę.<br />

Akuratwtymprojekcieliczbadziesięciuprogramistówbyłalekkoniewystarczająca.Stanowiłaproblemwkońcowejfazie,gdyzuwaginadługiczasakomodacjiwprojekcie,nie<br />

możnabyłozaciągnąćnowychpracowników.Poniżejznajdujesięskróconyopiskompetencji<br />

pozostałychdziałów,zktórymibezpośredniowspółpracująprogramiściprzyprodukcjigry.<br />

Projektanci<br />

Działodpowiedzialnyzaprojektgry.Zarównoodstronymechanikijakifabułyorazprojektu<br />

konkretnychlokacji 3 czypoziomówgry.Oczywiściedziałtenbardzoróżnisięwewnętrznie,<br />

wzależnościodrodzajutworzonejgry.<br />

Napewnomożnawnimwyróżnićdziałmechaniki.Sątoludzie,którzynapoczątku<br />

projektująmechanikęgry 4 ,następniesąodpowiedzialnizaimplementacjęizbalansowanie<br />

rozgrywkinapostawiedostarczonychprzezprogramistównarzędzi.<br />

3 Używamterminu”lokacja”wodniesieniudowirtualnych,spójnychobszarówświatagry,któresątworzone<br />

wtrakciepracnadgrąjakojednacałość.<br />

4 Mechanikagry(ang.gameplay).Podtymterminemrozumiemwszystkieaspektyinterakcjigraczazsys-<br />

tememgry.<br />

9


Kolejnymelementemjestdziałimplementacji,przyjmującyróżneformywzależnościod<br />

rodzajutworzonejprodukcji.BardzopopularnewśródpolskichdeweloperówgryFPP 5 zatrudniajątuzwyklekilkuprojektantówpoziomów.Przyprojekcie”Wiedźmina”działtenbyłprzedewszystkimodpowiedzialnyzawymyślenieszczegółowejfabułygryorazjejimplementacjęnaprzygotowanychprzezdziałtechnicznylokacjachgry.<br />

Działgraficzny<br />

Natendziałskładająsięartyści,graficydwuwymiarowejitrójwymiarowejgrafiki,animatorzy,dźwiękowcyoraztechnicyodpowiedzialnizaprzygotowanieelementówgryodstrony<br />

graficznejitechnicznej.Ważnyjestkontaktprogramistówzgrafikami.Trzebapamiętać,że<br />

nieznająonidokładnejmechanikidziałaniagryiżenaturalnieoceniająproduktfinalnypo<br />

tymjakwygląda.Ich<strong>praca</strong>możemiećbardzodużywpływnawymaganiapamięciowegryi<br />

jejprędkośćdziałania.Ważnejestbyimtouświadomić.Dobrąpraktykąjesttworzeniedla<br />

nichnarzędzipomagającychokreślaćkosztwydajnościowyipamięciowytworzonychprzez<br />

nichzasobów.<br />

Działkontrolijakości<br />

Wprodukcjigierniejesteśmywstaniegenerowaćautomatycznychtestówaplikacji,przynajmniejniewpełnymzakresie.Dlategokoniecznyjestsprawnydziałtestów.Napoczątkupracjestonprawiezbędny.Wmiaręzbliżaniasiędokońcaprojektunabieraznaczenia.PółtorarokuprzedzakończeniemWiedźminatesterówbyłodwóch.Przedsamymwydaniemgry<br />

wewnętrznydziałkontrolijakościWiedźminaliczyłprawiedwadzieściaosób,zczegoczęść<br />

zostałazatrudnionatylkodoczasupremiery.Dotegowspółpracowaliśmyzdziałamikontroli<br />

jakościwydawcyAtariorazzewspółzależnąfirmąCDProjektLocalizationCenter,która<br />

równieżwspierałanaswtestowaniugry.<br />

1.1.3.Tworzeniegier-produkcja<br />

Gdymamyjużkompletnyzespół,czaszabraćsięzaprodukcję.Tworzeniegierjestprocesem<br />

iteracyjnym.Ponieważnaproduktwynikowypracujejednocześniekilkazależnychodsiebie<br />

zespołów,dosyćszybkopotrzebnajestpierwszadziałającawersja.Bardzodobrąpraktyką<br />

jestzaczynanieodprototypu-prostegoszkieletugrystworzonegomożliwemałymnakładem<br />

sił,asprawdzającegopotencjałprojektu.Napodstawieprototypumożnaprzedrozpoczęciem<br />

rzeczywistejimplementacjiocenićizmodyfikowaćzałożonąmechanikęgry.<br />

Pracekoncepcyjnepotrzebujązaangażowaniadużomniejszegozespołuniżkońcowaimplementacjaprojektu.Powstającyprzeztrzylatahittegosezonu-graAssassinsCreedwyprodukowanaprzezUbisoftMontrealwpoczątkowejfazieprodukcjibyłatworzonaprzez8osób.Tenzespółtworzyłkoncepcjęgryorazrozpocząłpierwszepracenadsilnikiem.Wdalszychetapachpraczespółbardzoszybkosięrozszerzał,bypodkoniecprodukcjiurosnąćdo<br />

158osóbpracującychnadprojektem 6 .<br />

Dokumentacjaprojektowawbranżyrozrywkielektronicznejróżnisięijestsłabiejrozwiniętaniżwoprogramowaniubiznesowym.Rolęklientamożestanowićdystrybutor.WrozmowachznimniesąszerzejstosowanediagramyUML,przynajmniejwedługmojejwiedzy.<br />

5 GraFPP(FirstPersonPerspective).Rodzinatrójwymiarowychgierakcji,którełączyprezentacjaświata<br />

zperspektywypierwszejosoby.Graczwidzigręoczamisterowanegobohatera.Prekursoramigatunkubyły<br />

Wolfenstein3-D(1992)iDoom(1993).<br />

6 DanezaczerpnąłemzwywiaduzproducentkągryJadeRaymond.<br />

10


Oczywiściewprojekcieznalazłybyzastosowaniadokumentywizji.Ważnejestprzygotowaniediagramówklas.OdstronyprojektugrygłównymdokumentemjestGameDoc,bardzoszczegółowoopisującycałąmechanikęgry.Częstojegorolęspełniazbiórpomniejszychdokumentówopisującychposzczególneelementyprojektu.Relacjepomiędzyproducentemgryawydawcąróżniąsięodtychjakiepanująmiędzyproducentemaklientembiznesowym.Dokumenacjapełniwgrachdużomniejsząrolęijesttworzonaraczejnawewnętrznepotrzeby<br />

zespołuprodukcyjnego.<br />

Kolejnąistotnąrzecząsąnarzędzia.Będąpotrzebneinnymzespołom,dlategomusząpowstawaćszybko,wpoczątkowychfazachimplementacjiabywrazztworzeniemmechanizmów<br />

gry,powstałyjużnarzędziaumożliwiającewykorzystanieichwykorzystanieiichrozwójprzez<br />

grafikówczyprojektantów.<br />

Jakjużwspomniałem,pisaniegrytoprocesiteracyjny.Powstępnychprojektach,możliwieszybkopowinnapowstaćdziałającawersjagry.Wrazzniąpodstawowemechanizmy,naktórychopartabędzierozgrywka,byumożliwićpraceprojektantom.Początkoweetapyprodukcjimogąbyćpominięte,jeżeliproducentzdecydujesięnawykorzystaniugotowegosilnika<br />

gry.Przyustalaniuharmonogramupracprogramistycznychnależybraćpoduwagępozostałe<br />

zespołyizależnośćichpracyodstopniaimplementacji.Choćtoprogramiścijakopierwsi<br />

rozpoczynająpraceimplementacyjnenadprojektem,ichpracemogątrwaćdosamegojego<br />

końca.<br />

1.2. <strong>Moja</strong>gra<br />

Jakjużnapisałempowyżejgrykomputerowesączęstobardzodużymiprzedsięwzięciami,<br />

angażującymigrupęktórejtylkopomniejszączęśćstanowiąprogramiści.Przypisaniupracy<br />

magisterskiejmojąintencjąbyłowięcstworzeniepewnegoszkieletugry.Próbazmierzeniasię<br />

zestandardowymiproblemamiprogramistycznymipisaniagierorazstworzenieoryginalnej<br />

architektury,odpowiadającejspecyficemojegoprojektu.Niechciałemskupiaćsięnatworzeniuzasobówgryiustawianiurozgrywki.Chciałemstworzyćsilnikgrysieciowej,zobaczyć<br />

jaksprawdząsięwpraktycemojewłasne,oryginalnerozwiązaniawkwestiimechanizmów<br />

komunikacyjnychipodstawowejsymulacjiświatagrypostronieserwera.<br />

1.3. Grysieciowe<br />

Skoromojąpracęstanowigrasieciowa,porapowiedziećtroszkęotejgałęzikomputerowej<br />

rozrywki.Podpowyższymterminemrozumiewszystkiegrydziałającepomiędzykilkoma<br />

komputerami,połączonymizapośrednictwemzarównosiecilokalnej(LAN)jakiglobalnej<br />

(WAN).Stworzeniewydajnejarchitekturygrysieciowejbyłogłównymcelemmojejpracy.<br />

Możliwościpołączeniakomputerówiwymianyinformacjipomiędzynimi,wczasierzeczywistym,dosyćszybkozostałydostrzeżoneprzezproducentówgier.ZanimobsługasieciLAN<br />

stałasięstandardemkomputerówosobistych,gryczęstoumożliwiałypołączeniezinnym<br />

komputeremzapośrednictwemportówszeregowych.Grysieciowerozwijałysięwrazzrozwojempopularnościsiecilokalnych,internetuorazwzrostemszybkościtransmisji.Dziękicoraz<br />

większejdostępnościłączyszerokopasmowychwrodzajuDSL/ADSLgrysieciowepozwalają<br />

nazabawęcorazwiększejliczbiegraczyrównolegle.Największeprodukcje,najbardziejrenomowanychwydawców,jeżelinawetniesągramistrictedlawielugraczy,toprzynajmniej<br />

pozwalająnawspólnągręzapośrednictweminternetu.<br />

Technologiapisaniaaplikacjisieciowychwciążsięrozwija.Narynekwchodząprodukcje,którychpowstaniejeszczeniedawnobyłoniemożliwe,nietylkozewzględunaszybkość<br />

11


transmisji,alerównieżzewzględunatechnikitworzeniasamychgier.<br />

1.3.1.Kierunkirozwojurozrywkisieciowej<br />

Najczęściejgrasieciowastworzonajestwarchitekturzeklient-serwer(niewielkaczęśćgier<br />

dlakilkugraczystosowałamodelrównorzędny,wktórymwszyscyuczestnicyrozgrywkibyli<br />

wspólnieodpowiedzialnizasynchronizację).Serwermożezałożyćjedenzuczestnikówrozgrywkilubmogątobyćdedykowanemaszyny.Większośćgierumożliwiatakżerejestrowaniesięserwerówgrywoficjalnychserwisachwyszukujących.Wówczasgraczemająwgrzemożliwośćwyszukaniadostępnychwdanejchwiliserwerówgry.Nawetnadedykowanychmaszynach<br />

tylkonielicznegrysąwstanieobsłużyćliczbyrzędu,naprzykład,stupołączeń.Większość<br />

gierniezezwalanapołączeniewiększejliczbyniżkilkulubkilkunastugraczy,nawetposiadającychszerokopasmowydostępdointernetu.<br />

Odwielulatnastępujegwałtownyrozwójnowejgałęzigierdlawielugraczy.Massive<br />

MultiplayerOnline(MMO)togrypozwalającenajednoczesnązabawęnawettysięcyużytkowników.IchpoczątkówmożemydopatrywaćsięwtakzwanychModach,czylitekstowych<br />

grachRPG 7 ,pozbawionychgrafikiiobsługiwanychnajczęściejzapośrednictwemprotokołu<br />

telnet.Pierwsze 8 gryMMOumożliwiałyzabawętysięcygraczywewspólnymwirtualnym<br />

świecie.Byłtobardzodużykrokdlabranżyelektronicznejrozrywki.Nowegrytworzyły<br />

całąspołecznośćgraczy.Dystrybutor,jakożewymagautrzymywaniaoficjalnychserwerów,<br />

pobieranajczęściejmiesięczneopłatyodużytkowników.Jednocześnieaspektistnieniaspołecznościgryimożliwośćrozwojustatusugraczawświeciegry-tradycyjnadlagatunku<br />

gierRPG(najpopularniejużywanegowprodukcjachmassive)zaowocowałybardzodużym<br />

idługotrwałymprzywiązaniemgraczydoposzczególnychtytułówzgatunkuMMO.Sukceskomercyjnypierwszychprojektówspowodowałrozwójgatunkuipowstaniecałejlawiny<br />

kolejnychtytułów.<br />

ZwykledystrybutorgryMMOudostępniazestawoficjalnychserwerówdogry.Częstomamydoczynieniazrozproszonymzbioremserwerówobsługującychposzczególneczęściświata<br />

gry.SąteżprodukcjetakiejakGuildWars 9 ,wktórejpojedynczyserwerjestwstanieobsłużyćwieleegzemplarzyświatawktórychodbywasięsymulacjagry.Cechąwspólnąnowych<br />

produkcjiMMOjestuproszczonamechanikagry,pozwalającanaasynchronicznąobsługę<br />

klientów,jednocześniewbardzoatrakcyjnyispektakularnysposóbwizualizowanapostronie<br />

klienta.<br />

WielegierMMOmiałobardzodużeproblemyzbezpieczeństwemrozgrywki.Oszczędny<br />

protokółkomunikacjizbytdużączęśćmechanikigryrealizowałpostronieklienta(naprzykład<br />

poruszaniesięiwalkę),cobyłowykorzystywaneprzezgraczypoprzezstosowaniewłasnych<br />

lubprzerobionychaplikacjiklienta.WieluproducentówwykorzystywałowwalcezoszustwamiwgrzerozwiązaniawrodzajuGameGuard.Byłatoaplikacjapodobnawdziałaniudo<br />

programówantywirusowych,dołączanadogry.Zzałożeniamiałauniemożliwiaćklientowi<br />

7<br />

RPG-Roleplayinggame.Rodzinagierpowstałanapodstawie”papierowych”gierfabularnych.<br />

8<br />

Pierwsząwysokobudżetową,komercyjnągrąMMORPG(MultiplayerMassiveOnlineRoleplayingGame)<br />

byławydanaw1997rokuUltimaOnline.<br />

9<br />

Wydanaw2005rokugraArenaNet,napoczątkuopisywanajakoświeżepodejściedogatunkuMMORPG.<br />

Wpraktycegręciężkosklasyfikować,rozgrywkajestbardzoszybkaiwdużymstopniuzręcznościowa.Toczy<br />

sięwoddzielnychegzemplarzachświatagry,wktórychwystępowaćmożeodjednegodokilkunastuzdalnych<br />

graczy.Graczemogąsięjednakspotykaćliczniewobszarach”miejskich”,wktórychniewystępująelementy<br />

zręcznościowe.Tamłącząsięwgrupyirozpoczynająwłaściwąrozgrywkę.Producentchwalisię,żetechnologia<br />

sieciowaużytawsilnikujestwyjątkowooryginalnaioszczędnawtransmisji,coumożliwiłoznaczneobniżenie<br />

kosztówutrzymaniaserwerówizrezygnowaniezopłatabonamentowych.Jestonaowianamgłątajemnicy.<br />

PewnerozwiązaniazastosowanewmojejpracyczerpałemzrozważańnadimplementacjąGuildWars.<br />

12


wykorzystanieznanychsposobównadużyciasystemu.Bytoosiągnąćpodejmowaładziałania<br />

wrodzajuskanowaniaplików,kontrolędziałającychprocesówczyblokowaniewywołańokreślonychfunkcjiDirectXczyWindowsAPI.Osobiścieuważammożliwośćdokonaniatakich<br />

nadużyćzasłabośćarchitekturygryiprojektującswojągrę,miałemnaceluzapewnienie<br />

bezpieczeństwarozgrywkijużnapoziomiegłównychzałożeńprojektowych.<br />

Grysiecioweuważamzaprzyszłośćbranży.Wzrostmocykomputerówniedawnojeszcze<br />

wydawałsiębardzospowolniony,dopieropopularyzacjamaszynwielordzeniowychspowodowałapewienpowiewświeżościnarynkukomputerówosobistych.Natomiastrozwójszybkościtransmisjiiinfrastrukturyinternetuwciążpostępujeijestdalekiodosiągnięciagranicmożliwościrozwojutechnologicznego.<br />

SwojągręchciałemumiejscowićgdzieśpomiędzygramiMMO,astandardowymigrami<br />

sieciowymi.Chciałemdokonaćpewnegoeksperymentuinawłasnejskórzesprawdzićjakwielu<br />

graczymożeobsłużyćgraakcji.Starałemsięstworzyćbardzowydajnąaplikacjęserwera<br />

umożliwiającąprzyszybkimłączuidobrej,wielordzeniowejmaszynie,byjednocześniew<br />

świeciegrymogłasięspotkaćrzeczywiściedużaliczbagraczy.<br />

13


Rozdział2<br />

Projekt<br />

2.1. Założeniaprojektu<br />

•Planowałemstworzyćprostąiprzyjemnąinternetowągręakcji.<br />

•Modelsterowaniawzorowałemnaklasykachtakichjak„Asteroids” 1 czykilkuinnych<br />

grachzaliczanychdo„kosmicznych”gierzręcznościowych.Miałbyćprosty,intuicyjny<br />

iprzyjemny.<br />

•Gramiałaumożliwiaćzabawęmożliwiedużejliczbygraczy.<br />

•Graczmiałwcielaćsięwpilotakosmicznegomyśliwca,realizującegoróżnorodnemisje<br />

wpasieasteroidów.<br />

•Realizującpowierzonemuzadaniagraczmiałzarabiaćwirtualnepieniądze.<br />

•Uczestnicygrymielimiećmożliwośćpodejmowaniasięróżnychmisji.Ichzadaniamiały<br />

sięodsiebieróżnić.Czasamiichrealizacjamiaławymagaćodnichwspółpracyramię<br />

wramię,aczasamiprowadzićdonieuchronnejkonfrontacji.<br />

•Pomiędzyrealizacjąmisjigraczemielimożliwośćrozmowymiędzysobą,rozbudowy<br />

statkówzazarobionewirtualnepieniądzeorazposzukiwaniazleceńnanowemisjew<br />

pasieasteroidów.<br />

•Rozgrywkamiałabyćwizualizowanazwykorzystaniegrafikitrójwymiarowej,choćprostymodellotuzakładałdwuwymiarowąmechanikęgry.<br />

2.2. MaelstormOnline<br />

MojągręnazwałemMaelstormOnline.Stworzyłemzgodnyzzaplanowanymiwytycznymi,silniksieciowejgryakcji.Samakoncepcjagrywtrakciepisaniapracyuległapewnymzmianom.<br />

Zadanietworzeniasilnikagrypochłonęłowięcejwysiłkuipracyniżnapoczątkuzakładałem.<br />

Uważamgowbieżącejchwilizakompletny,choćzpowoduograniczeńczasowychpewnemu<br />

uproszczeniuuległywłaściwościsamejrozgrywki.<br />

Takwtejchwili,wpunktach,mogęprzedstawićcechymojejgry.<br />

1 Asteroids–grawydanaw1979rokuprzezAtariInc.Polegałanalataniustatkiemwdwuwymiarowej<br />

przestrzenikosmicznejograniczonejrozmiaremdoekranuiniszczeniukolejnychfalasteroid.<br />

15


Rysunek2.1:Disasteroids3D.Wersjaklasycznejgryakcji,będącajednązmoichinspiracji.<br />

•Podstawowaforma,koncepcjaisposóbkontroliorazprezentacjigryzostałyzrealizowane<br />

zgodniezzałożeniami.<br />

•Modelsterowaniajestzgodnyzzałożeniami.Obiektyporuszająsięzzachowaniemkierunkuruchuipędu.Mogąobracaćsiędowolnieizmieniaćtrajektorięruchu,przyśpieszającwkierunkuwktórymsązwrócone.Naruchwpływateżsiłatarcia<br />

2 .<br />

•Rozgrywkatoczysięwpasieasteroidów.Wświeciecałyczaswystępujezbliżonaliczba<br />

asteroidów.Namiejscezniszczonychzczasempojawiająsięnowe.<br />

•Pozalogowaniusiędogry,graczwybierajedenztrzechdostępnychstatków.<br />

•Dodyspozycjigraczasątrzyrodzajebroni.<br />

•Zarównostatkigraczajakiasteroidymogązostaćuszkodzonewwynikukolizjibądź<br />

trafieniapociskiem.Statkiprzedbezpośrednimiuszkodzeniamibronipoleenergetyczne.<br />

Słabnieonogdyblokujetrafienia,aleodnawiasiępowoliwrazzupływemczasu.<br />

•Graczewspółzawodnicząnaserwerzedążącdozdobycianajwiększejliczbypunktów.<br />

•Punktyprzyznawanesąwmałejliczbiezaniszczenieasteroidów.Większąliczbępunktówmożnazdobyćniszczącstatkiinnychgraczy.<br />

•Gdystatekgraczazostaniezniszczony,możeonponowniewejśćdogrywnowowybranymstatku,alekosztujegotookreślonąliczbępunktów.<br />

•Graczewiedząktóryznichdysponujenajwiększąliczbąpunktów,dlategoutrzymanie<br />

przezniegoprowadzeniawpasieasteroidówjestdodatkowoutrudnione.<br />

2 Mimożewpróżnitarcieniewystępuje,uwzględniłemjewmoimmodeluporuszania,gdyżzwiększaono<br />

atrakcyjnośćrozgrywki.Powodujeżegraczeniemusząobawiaćsięzbytniegonabieraniaprędkościasama<br />

rozgrywkaniejesttakchaotycznaiprzypadkowa.<br />

16


2.3. Wpływwymagańprojektunaarchitekturęgry<br />

Wymaganiaprojektubyłydecydującymczynnikiemnaetapieprojektowaniaaplikacjiisilnika<br />

gry.<br />

•Wgrzebierzeudziałmożliwiewielugraczy—Komunikacjamusibyćoszczędna,<br />

aaplikacjaserwerabardzowydajna.<br />

•Gratoczysięwprzestrzenikosmicznej”rzadko”wypełnionejobiektami—<br />

Towymaganiewpływanaarchitekturęwnastępującychkwestiach:<br />

–Możemyograniczyćwiedzęgraczyoświeciedoichnajbliższegootoczenia,ato<br />

wpływanawydajnośćibezpieczeństwoaplikacji.<br />

–Nietrzebaimplementowaćmechanizmu”wyszukiwaniaścieżek”.<br />

–Zdarzeniaświatagrymająwpływzwyklenaniewielkiegrupyobiektów.Jeżeli<br />

przyjdązopóźnieniem,doichpoprawnegoobsłużeniapowinnawystarczyćwstecznasymulacjadotyczącawyłącznieobiektówbezpośredniozwiązanychzezdarzeniem.<br />

–SystemAIwMaelstormmożnaoprzećoalgorytmstada,przedstawionewrodziale3.7<br />

•Interfejsgryjestprosty,asamarozgrywka„łatwaiprzyjemna”—Towymagałoumożliwieniawyświetlaniaładnejgrafikitrójwymiarowej,modeliiefektówświetlnych.Światgryjestdwuwymiarowy,alegrafikamusisięprzystępnieprezentować.Zdrugiejstronyaplikacjaklientaniejestspecjalnierozbudowanaadziękiswojejprostocieniemusiałemsięskupiaćnadjejoptymalizacją.<br />

•Wmodelugryintuicjaitaktykamająbyćistotniejszeodczystejzręczności<br />

irefleksu—Towsumiejestcechagrywynikłaznałożonychnaniąwymagań.Jej<br />

implementacjawymaga:<br />

–Czystyrefleksniemożedominowaćrozgrywki,ponieważdyskwalifikujegraczyo<br />

większychopóźnieniach.<br />

–Akcjegraczawykonująsiękrótkiczasporzeczywistymwydaniuprzezgraczapolecenia.Tenczasjestpotrzebnybyinformacjaoakcjidoszłanaserweribyserwer<br />

rozesłałjądozainteresowanychgraczy.<br />

•Obiektysąwciągłymruchu,tylkoichniewielkaczęśćjestwspoczynku<br />

—Towymuszabardzowydajnąarchitekturęsymulacjiporuszaniasięobiektów.Dla<br />

oszczędnościkomunikacjisymulacjaporuszaniamusibyćniezależnapostronieserwera<br />

iklientów.<br />

•Graczemusząmiećprzyjemnośćzzabawywmiaręniezależnieodopóźnienia<br />

wkomunikacjizserwerem.<br />

–Odpornośćnaopóźnienia.<br />

–Wmomencienadejściaopóźnionejwiadomościzserweramusimymóc”cofnąć”w<br />

czasiezwiązaneznimobiektyiponowniejezasymulowaćporeakcjinazdarzenie.<br />

•Gramabyćwpełni„uczciwa”inależyuniemożliwićoszukiwanieserwera.<br />

17


–”Serwermazawszeracje”—symulacjaświatapostronieklientajestodbiciem<br />

symulacjiświatanaserwerze.<br />

–Graczwysyładoserwerawyłącznieswojesterowanieorazdodatkowezapytania<br />

odnośniewidzianychprzezniegoelementówsymulacji.<br />

Bynietracićskalowalnościiuniwersalnościprojektu,istotnebyłozachowaniewłaściwejmodularyzacjikodu,umożliwiającejłatwąmodyfikacjęizamianęposzczególnychczęści<br />

silnika.Dlategostarałemsięwmiaręmożliwościniedoprowadzaćdogłębokichzależności<br />

pomiędzyarchitekturąaplikacjianastępującymiwłaściwościamigry:<br />

•Dwuwymiarowyświatgry.Powinnabyćmożliwośćstworzeniaproporcjonalniemałymkosztemzupełnienowegoświatagry.<br />

•Użyteprotokołykomunikacyjne.<br />

•Sposóbgraficznejprezentacjiświata.<br />

2.4. Szerszakoncepcjagry<br />

TworzącMaelstormchciałemspróbowaćswoichsiłwimplementacjigrydlawielugraczydostępnejzapośrednictweminternetu.Taknaprawdęmiałemwzamyśledużoszersząkoncepcję<br />

rozgrywki.ChciałembyMaelstrom,wpostacizbliżonejdoobecnej,byłelementemwiększego,<br />

rozproszonegosystemu.Zakładałem,żegraalbobędziemogłaobsłużyćidącąwsetkiliczbę<br />

graczy,alboobsługamniejszejichliczbybędzienatylemałokosztowałaaplikacjęserwera,<br />

żebędziemożnanapojedynczymkomputerzeuruchomićkilkajejinstancji.<br />

WówczasmożnabyMaelstormrozbudowaćododatkowąaplikację,tworzącąspójnyświat<br />

grywktórymkluczowymelementembyłabyspołecznośćgraczy.Ta”graspołeczna”symulowałabyrozległyświatstacjikosmicznych,wktórychgraczeprzebywalibypomiędzymisjami<br />

wypełnionymiakcją.Mogłabybyćbardzouproszczonaipozwalaćgraczomnawydawanie<br />

zarobionychpieniędzy,interakcjęzinnymigraczamiorazpodejmowanienowychwyzwańrealizowanychnaserwerzegryakcji(czyliMaelstromwjejaktualnejpostaci).Głównaaplikacjaniepotrzebowałabytrójwymiarowejgrafikiczyefektownegomodeluakcji.Niemiałabyelementówzręcznościowychipostronieserwerabyłabyzrealizowanajakoaplikacjabazodanowa.<br />

Serwermógłbywięcobsługiwaćcałąwirtualnąspołecznośćgraczy.<br />

Byłabytowłaściwiezupełnienowagra,obardzodużejmożliwościrozbudowy,będąca<br />

spoiwemzapewniającymcałejrozgrywceatrakcyjność.Wrazzgrąakcji,którejsilnikzaimplementowałem,umożliwiłabystworzenieżywejspołecznościgraczy.Jejmożliwośćrozbudowyiwłasnościzależałybywyłącznieodmożliwościimplementacyjnych.Mogłabyumożliwiać<br />

stworzenieekonomiiświatanaktórywpływmiałybyakcjerealizowaneprzezgraczyiktóry<br />

pozwalałybygraczomnazabawęwhandelwirtualnymidobrami.Możnabyteżzaimplementowaćsystemorganizacjiwktórychskładmoglibywchodzićgracze.Organizacjeoczywiście<br />

prowadziłybywłasnąpolitykęfinansów,sojuszyiwojen.Tobyłbybardzomocnymechanizm<br />

społeczny,którypozwalałbynanadaniedodatkowegowymiaruzmaganiomgraczywprzestrzenikosmicznej.Całośćtakiejaplikacji,jakjużmówiłem,ograniczajątylkomożliwościimplementacyjneewentualnegoautoraiwyobraźnia.WwynikujejpowstaniacałagrastałabysięrzeczywiścieprodukcjąMassiveMultiplayerOnline.Wątpiębyistniałarealnaszansa<br />

natakąrozbudowęprojektu,alechciałemwyrazićswojąwizjęimarzeniastanowiąceojego<br />

koncepcji.<br />

PiszącMaelstormzakładałemtaknaprawdę,żetworzęelementtakiejwłaśnierozproszonej<br />

aplikacji.Stądnaprzykładpojawiłysiępomysływczytywaniacałejkonfiguracjirozgrywki,<br />

18


łączniezidentyfikatoramigraczy,zplikówxml,któremogłybybyćwysyłanenaserwergry<br />

akcjiznadrzędnegoserweragryspołecznej.Możliwośćwyboruserwera,swobodnegologowaniasiędogryorazzasadyrozgrywki(niszczenieasteroidówiinnychgraczy)zostałydodanew<br />

końcowymetapieimplementacji,by<strong>praca</strong>nabrałapełnegokształtu.Byłytojednakelementy<br />

doktórychniepodchodziłemztakąpieczołowitościąisercemjakdopodstawowegosilnika<br />

gry.<br />

19


Rysunek2.2:MaelstormOnline.<br />

20


Rozdział3<br />

Implementacja<br />

WtokupracnadMaelstormOnlinemiałemmożliwośćzmierzeniasięzdużąliczbązagadnień<br />

związanychztworzeniemgier.Poniżejopisałemrozwiązaniaużyteprzezemniewtokuprac<br />

nadprojektem.Mocnywpływmiałananiespecyfikamechanikimojejgry.Pozaczystym<br />

opisempracimplementacyjnych,mojąintencjąbyładyskusjamożliwychsposobówpodejścia<br />

doomawianychproblemów.Swojeinspiracjeczerpałemztokupracnadprojektem,literatury,<br />

pracyzawodowejizaobserwowanychwpraktycerozwiązań.<br />

3.1. Projektiśrodowisko<br />

3.1.1.Historiaprac<br />

Pracenadprojektemzacząłemwroku2004,będącnaczwartymrokustudiówwramach<br />

przedmiotu”ProgramowaniePraktyczne”prowadzonegoprzezdr.RobertaMarona.Miałem<br />

wciągurokuzaprojektowaćizaimplementowaćkompletnąaplikację-ibyłotomojepierwsze<br />

podejściedotejkonkretnejgrysieciowej.<br />

Doprojektuzabrałemsięwdosyćnietypowysposób-zaczynającodstworzeniagryna<br />

jednegogracza,zupełnieniedzieląckodunaaplikacjęserweraiklienta.Mogłemsobienato<br />

pozwolićdziękizastosowaniuspecyficznegoprotokołukomunikacjiiarchitektury,aleotym<br />

napiszęwdalszejczęścipracy.Wciągupołowyrokuotrzymałemprostysilnikgrydlajednego<br />

gracza,bywciągunastępnegosemestruwykonaćprostyprotokółkomunikacjiiuruchomić<br />

gręnadwóchkomputerach.Grajednakbyławyraźnieniekompletna-pozasamąkonfiguracjąrozgrywki,zabrakłobardziejzaawansowanejmożliwościtworzeniagrysieciowej.Istniał<br />

właściwieszkieletgry,któryczekałnawypełnieniedanymiorazzamianęczęścimodułówna<br />

końcowąimplementację.<br />

PostanowiłemuczynićMaelstormOnlinemojąpracąmagisterską.Bogatszyodoświadczeniarokupracnadprojektem,zdecydowałemsięnabardzodużezmianywistniejących<br />

jużmechanizmach.Dziękimodularnejkonstrukcjimogłemzupełniepodmienićdużączęść<br />

modułówgry,wtymporuszaniesię,wykrywaniekolizjiiwyświetlaniegrafiki.Wpierwszej<br />

wersjiMaelstromwyświetlałemgrafikęwykorzystującbibliotekęOpenGL,jednakzdecydowałemsięnawykorzystaniewtymcelugotowejbibliotekiOgre3dicałkowiciepodmieniłem<br />

modułgraficzny.Tosamospotkałonapisanyzupełnienanowomodułporuszaniasię.Zmiany<br />

byłyzwiązaneznowymmechanizmemcofaniaruchów,koniecznymdoimplementacjimojego<br />

protokołukomunikacyjnego.Zmianieuległoteżsamosercesymulacjiorazwiększośćmechanizmów.Znowujednak,byumożliwićszybszestworzenieprototypugry,zrezygnowałemze<br />

wspieraniaarchitekturysieciowej.<br />

21


Wtrakciepracnadprojektemnapoczątkupiątegorokustudiówrozpocząłempracęzawodową,cobyłoprzyczynąpoważnegoopóźnienia,alejednocześniepozwoliłominakonfrontację<br />

własnychrozwiązańipomysłówztymi,stosowanymiwkomercyjnychprojektach.<br />

Wsierpniu2007roku,ponownieutworzyłemsilnikgrydlajednegogracza,bezpodziału<br />

naaplikacjęklientaiserwer.Polegałemjednaknauprzedniodobrzesprawdzonymsposobie<br />

podziałuaplikacji.Rozwójpraktycznejczęścipracymagisterskiejtrwałdolistopada.<br />

Rysunek3.1:Wczesnawersjaprojektu.DziałającawśrodowiskuLinuxiopartaointerfejs<br />

OpenGL.<br />

3.1.2.Środowiskoiplatforma<br />

MaelstormzostałnapisanywcałościwjęzykuC++.Choćnieuważałemtegozapriorytet,<br />

grępisałemodpoczątkuzzałożeniemprzenośnościkodupomiędzyplatformamiLinuxiWindows.Niewymagałotobynajmniejspecjalnychnakładówpracy.Jedynymiograniczeniamidlamnie,byłakoniecznośćużywaniaprzenośnychbibliotekoraznieużywaniefunkcjisystemowychbezpośredniowkodziegłównejaplikacji.GręprzezdwalatatworzyłempodLinuxem,korzystajączdarmowejwtyczkiC++doedytoraEclipseorazzestawuskryptówiprogramówautomake/autoconfdoautomatycznejkonfiguracjikompilacji.Jednocześnieniezależnie<br />

poznałemśrodowisko.Netiskuszonyjegoprostotą,funkcjonalnościąiwygodąużytkowania<br />

postanowiłemprzenieśćprojektnaplatformęWindows.ZajęłotojedendzieńijedynymproblememdlamniebyłakompilacjaużytejwgrzebibliotekiXercesCwśrodowisku.Net.To<br />

dobralekcja,bopokazujejakłatwopisaćprzenośnykod.Większośćgierwideonakompu-<br />

22


teryosobistepowstajewyłącznienaplatformęWindows,ewentualnierównieżnakonsole.Z<br />

punktumarketingowegotylkonatychplatformachopłacasięsprzedażgier,jednakjaksię<br />

okazujenakładyzwiązanezwydaniemgrynainnąplatformęmogąbyćpraktyczniepomijalne<br />

-przyzałożeniu,żekorzystamyzprzenośnychbibliotek.Ituwychodzipodstawowyproblem<br />

gierdlasystemówUnix,którymjestbrakdostępnegotylkonaplatformieWindowspakietu<br />

DirectX.Oferujeonbardzodużemożliwościwwyświetlaniugrafiki3D.ProducenciprzedkładająkomfortpracyzwiązanyzużywaniemDirectXnadutrzymywaniemwieloplatformowościkodu.ZamnienaszczęścietenproblemzałatwiałabibliotekaOgre3dodpowiedzialnazagrafikę,apotrafiącaobsługiwaćzarównointerfejsDirectXjakiOpenGL.Zastosowałemnietypowepodejściedorozłącznychaplikacjiklientaiserwera.Nietworzyłemosobnychklasdlaobuaplikacji,ajedyniezaznaczałemwkodzieróżnicezapomocą<br />

dyrektywkompilatora#if#ifdef.Obieaplikacjechodziływięcwoparciuotensamkod,<br />

wymaganawięcbyładwukrotnakompilacjategosamegoprojektuwróżnychkonfiguracjach.<br />

MojerozwiązanietegoproblemupodLinuxembyłobardzoniefunkcjonalne.Wśrodowisku<br />

.Netpoprostustworzyłemnowe,kompilowanedoosobnychkatalogów,konfiguracjeprojektu.<br />

3.1.3.Użytebiblioteki<br />

Mojąintencjąbyłoskupieniesięnaimplementacjisilnikamechanikigrysieciowej.Wmiarę<br />

możliwościimplementacjępobocznychmodułówpozostawiłemwgestiizewnętrznychbibliotek.<br />

•Bibliotekinarzędziowe—W<strong>praca</strong>chnadprojektemwykorzystywałembibliotekiSTL<br />

iBOOST(http://www.boost.org).Sąonemocnozintegrowanezkodemaplikacji.STL<br />

wykorzystywałemgłówniedoreprezentacjistrukturdanych-rozszerzalnychtablic,zbiorów,słownikówikolejekpriorytetowych.DodatkowowykorzystywałemzaimplementowanewSTLsortowanieiobsługęstrumieni.BibliotekaBOOSTskładasięzwielu<br />

niezależnychmodułów.JawykorzystywałemgłówniemodułnarzędziowyBIND 1 imodułdoobsługiwielowątkowościthread.Szczególnieprzypadłmidogustuinterfejstegomodułu.Jestonmocnoopartyoszablonyiwwiększościwypadkówopierasięnainicjalizacjiobiektówwkonstruktorze.Naprzykładmutexjestpodnoszonyizwalnianywkonstruktorzeidestruktorzecoznacznieupraszczakodaplikacjiizapobiegastandardowymbłędom.<br />

•Bibliotekagraficzna—Zpoczątkuplanowałemsamemustworzyćmodułwyświetlaniaaplikacjiklienta,opartyoOpenGLibibliotekęSDL[bSDL](SimpleDirectMediaLayerhttp://www.libsdl.org).Pierwszawersjamodułuwyświetlaniachoćtrójwymiarowa,reprezentowałaobiektyzapomocądwuwymiarowych,obracanychobrazów.<br />

NapisałemprostymodułwczytywaniamodelizformatuMD2 2 .Gdyuczyniłemprojektmojąpracąmagisterskąuznałem,żeilośćpracy,którąmusiałbymwłożyćwmodułgraficzny,jestzbytdużaicałewyświetlanieoparłemnasilnikugraficznymOgre<br />

3D[bOGR](http://www.ogre3d.org).Ogreokazałsiębyćpotężnąbibliotekągraficzną,<br />

którawbardzoprostysposóbumożliwiłamireprezentacjęobiektówgrywpostacitrójwymiarowychmodeli,dodawanieefektówspecjalnych,zarządzaniezasobamigraficznymiiwyświetlanie.ŚwiatgrywOgrejestreprezentowanywpostacidrzewa.Wszyst-<br />

1 ModułBINDbibliotekiBOOSTwspieraprogramowaniefunkcyjnewC++.Udostępniaszablony,które<br />

umożliwiajątworzeniewskaźnikówdometod,któremogąbyćtraktowanejakwskaźnikidozwykłychfunkcji.<br />

Dziękitemumożnaichużywaćwargumentachwywołaniafunkcjiprzyjmującychwskaźnikidofunkcji.<br />

2 Formatmodelu3DużytywgrzeQuake2.JesttojednazkultowychgierFPPstworzonaprzeidSoftware.<br />

Wydanawgrudniu1997rokuprzezActivision.<br />

23


kieobiektygraficznesąwięcprzypisanedojegowierzchołków.Zmieniającparametry<br />

wierzchołków,przesuwając,obracającalboskalującje,możemywpływaćnazachowanie<br />

całejhierarchiiobiektów.DowyświetlaniaiobsługiGUI(GraphicalUserInterface)użyłembibliotekiCEGUI[bGUI](CrazyEddie’sGuiSystemhttp://www.cegui.org.uk).JestonapolecanadoużytkuwprojektachopartychobibliotekęOgreibardzodobrzesięzniąintegruje.Jednocześniepozostajezupełnieniezależnaimożnajejużyć<br />

wpołączeniu,zpraktyczniedowolnyminnym,systememwyświetlania.Użytewniej<br />

podejścieirozwiązaniadotyczącetworzeniaikonfiguracjiinterfejsuużytkownikabardzodobrzepasujądoprojektugry.NiestetybibliotekaCEGUIjestwtrakcierozwoju.<br />

Standardoweschematygraficzneinarzędziadołączonedobibliotkiwymagająjeszcze<br />

rozwinięcia.Aplikacjaserweramawyłączonewyświetlaniegrafiki3D.Byzrobićdla<br />

niejprostyinterfejsużytkownikaużyłembibliotekipdCurses(PublicDomainCurses<br />

http://pdcurses.sourceforge.net),czyliwieloplatformowejwersji,znanejspodLinuxabibliotekincursesdoniskopoziomowejobsługiwyświetlaniatekstowegowkonsoli.<br />

•Bibliotekasieciowa—Poszukiwałemwmiaręniskopoziomowej,wieloplatformowejbibliotekisieciowej,obsługującejprotokółTCP.NajpierwwybrałembibliotekęSDLnet,<br />

jakożecałyprojektopierałemnabiblioteceSDL.Bibliotekamiałapewnebraki,ale<br />

wydawałosię,żejestwtrakcierozwoju.Projektjednakbyłjużmartwyigdyponownie<br />

zabrałemsięzatworzeniewarstwysieciowejużyłemtymrazembibliotekiASIO[bAIO]<br />

(http://asio.sourceforge.net).Nazwębibliotekimożnatłumaczyćjako”asynchronous<br />

inputoutput”.SamabibliotekajestbardzomocnozintegrowanazbibliotekąBOOST.<br />

Jestbardzowygodnawzastosowaniu,całyjejkodznajdujesięwplikachnagłówkowych,<br />

dlategoichdodaniejestjedynączynnościąwymaganądodołączeniajejdoprojektu.<br />

Opartajestoszablonyijejskalowalnaiuniwersalnaobsługakomunikacjisieciowejw<br />

bardzociekawysposóbprzesłanianiskopoziomowąimplementacjęobsługiprotokołów<br />

TCPiUDP.Dodatkowobibliotekawbardzowygodnysposóbobsługujeasynchroniczny<br />

odbiórdanychwspierającsięmetodamiprogramowaniafunkcyjnego.Asynchroniczny<br />

odczytalbozapispakietuzwiązanyjestzwywołaniempowiązanejzoperacjąfunkcji.Bardzoeleganckimrozwiązaniemtejbibliotekijestklasaioserviceprzesłaniająca<br />

obsługęzbiorugniazdsieciowychiułatwiającawielowątkoweprzetwarzanieichżądań.<br />

•BibliotekaXML—Postanowiłemwczytywaćkonfiguracjęgryzapośrednictwemplików<br />

XML.DoobsługitegoformatuwykorzystałembibliotekęXercesC(http://xerces.apache.org).<br />

TorozległaibardzofunkcjonalnabibliotekaobsługującazarównomodeleDOM 3 iSAX 4 ,<br />

pozwalającatakżenawalidacjędokumentówXML.JawykorzystałemwyłączniefunkcjonalnośćdoobsługimodeluSAX,chociażwpraktyce,odczytującdokumentzapomocąinterfejsSAX,tworzyłemwłasnedrzeworeprezentacji.<br />

3 DOM–DocumentObjectModel.Obiektowy,uniwersalnyinterfejsprogramistycznydoprzeglądaniado-<br />

kumentówXMLwcałościwczytywanychdopamięci.<br />

4 SAX–SimpleAPIforXML.ModelzdarzeniowyodczytudokumentówXML.<br />

24


3.2. Architekturaaplikacji<br />

Wcałymprojekcienajważniejszymelementembyłostworzeniebardzowydajnejarchitektury<br />

grysieciowej.Byłtodlamnierzeczywiściepriorytetiwteelementyaplikacjiwłożyłemchyba<br />

najwięcejserca.Silnikgryjestmożliwieuniwersalny,mimomocnegooparciaozałożenia<br />

projektu.<br />

3.2.1.Definicjaproblemu<br />

PrzyprojektowaniuMaelstormOnline,przedewszystkimkierowałemsięzałożeniem,by<br />

umożliwićstworzeniesieciowejgryobardzowydajnejkomunikacjipomiędzyserweremiklientem.Liczbęprzesyłanychwobiestronyinformacjinależałowięcograniczyćdominimum.<br />

Jednocześnie,ponieważtworzyłemgręzręcznościową,szczególnieistotnabyłaodpornośćna<br />

opóźnieniatransmisjisieciwaplikacjiklientaiserwera.<br />

Kolejnąkwestiąbyłaskalowalnośćprojektu.Maelstormwchwiliobecnejjestmalutkągrą<br />

akcji,chciałemjednakstworzyćinfrastrukturęnaktórejmożnabybyłooprzećdużobardziej<br />

rozbudowanąizróżnicowanągrę.Starałemsiębyprojektbyłelastycznywrozbudowieoraz<br />

umożliwiałłatwązamianęużytychrozwiązańdziękidużejmodularyzacjikodu.<br />

3.2.2.Światgry<br />

Nacałokształtdynamicznegoświatagryskładająsięobiektygry 5 MapObjectigraczePlayer.<br />

Gracztoabstrakcyjnyobiektreprezentującyobiektdecyzyjny,sterującyobiektemgryizbierającyoniminformacje.Playermożenaaplikacjiklienckiejreprezentowaćgraczalokalnego.Możebyćgraczemzdalnym,zktórymjesteśmybezpośredniopołączeni(tasytuacjawystępujenaaplikacjiserwera),bądźjedynieabstrakcjągracza,zktórąniemożemysiębezpośredniokomunikować(innigraczenaaplikacjiklienckiej).MożetoteżbyćgraczAIsterującyobiektem.Wsilnikuzostawiłemteżfurtkę,byzaimplementowaćsterowaniewieluobiektówgryprzezpojedynczyobiektgracza,couprościtworzeniezorganizowanejgrupyprostychobiektów.Oczywiścieniekażdyobiektgrymusibyćsterowany.Prosteobiektynieanalizująceotaczającegojeśrodowiska,jakpociskiczyszczątkiasteroidyniemająprzypisanegoimgracza.<br />

Rysunek3.2:”Światgry”<br />

5 Terminuobiektgrybędęużywałwdalszejczęścipracywodniesieniudopodstawowegoelementubiorącego<br />

udziałwsymulacjiświatagry.Wzależnościodgry”obiektemgry”mogęnazwaćbiorącewniejudziałpostacie,<br />

reaktywneelementyotoczeniaczynaprzykładpojazdy.<br />

25


Akcjeświatagry<br />

KlasaWorldActionreprezentujeakcjeświatagry.Sątobardzoulotneobiekty,okrótkim<br />

czasieistnienia.Akcjesątrzymanewkolejcepriorytetowej,wktórejpanujeporządekzupełny,toznaczyakcjenawetwjednejdyskretnejjednostceczasurozpatrywanesąwzadanej<br />

kolejności.Każdaakcjapotrafisię”wykonać”.Każdeistotnezdarzeniegry,którezależyod<br />

interakcjipomiędzyobiektamialboreakcjigracza,aniejesttylkonaturalnymnastępstwem<br />

wewnętrznegostanuobiektu,jestreprezentowaneprzezakcjęświata.Poniżejopiszętenprocesdokładniej.Akcjegrysąjedynymiobiektamigrybezpośrednioprzesyłanymiprzezsieć,<br />

pouruchomieniupełnejkomunikacjipomiędzyklientemaserwerem.<br />

Ponieważoperacjetworzeniaiusuwaniaobiektówakcjipotencjalniemogłybyćwąskim<br />

gardłemaplikacjistworzyłemwłasnycyklicznyalokatordlanich.Ponieważsątoobiektyo<br />

krótkimczasieżycia,alokatormożeużyćdopasowanejdoichsposobuużyciastrategiiprzydzielaniaizwalnianiaichpamięci.Szczegółynatematkonstrukcjialokatoracyklicznegoznajdująsięwrozdziale3.8.1.<br />

Obiektgry<br />

Rysunek3.3:Diagramklasdlahierarchiireprezentującejobiektgry.<br />

Chciałemuniknąćtrzymanianadmiarowychinformacjiwobiektachgry,przyjednoczesnym<br />

zachowaniuskalowalnościprojektu.Woczywistysposóbwiązałosiętozmechanizmamiobiektowymi,główniedziedziczeniem.Takwięcobiektposiadałtylkopotrzebnemudane,przynajmniejjeżelichodzioinformacje,któremogłybyćprzesyłanewkomunikacjiklient-serwer.Tooczywiściezagrażałoskalowalności.Przypuśćmy,żebędziemymieliklasynieruchomychobiektów(którychstanopisujetylkopozycja)iporuszającychsięorazklasęobiektówpowiedzmy<br />

26


strzelającychinieaktywnych.Wówczasjeżelibędziemywszystkieteinformacjechcielizapisać<br />

wjednejklasie,posiadającejfunkcjonalnośćobiektustrzelającegoinieruchomego,naturalnymrozwiązaniembędziewielodziedziczenielubkopiowaniekodu.Wielodziedziczeniewtakichsytuacjachjestskomplikowaneiosłabiaskalowalnośćprojektu.Moimrozwiązaniembyło<br />

rozbicieobiektugrynazestawpołączonychobiektówopisującychkolejnejegocechy.Poniżej<br />

opisujęklasyobiektówściślezwiązanychzobiektemklasyMapObject.<br />

•Stats—Nazwaklasyjestzaszłościązdługiejhistoriiprojektu.Jesttoklasaobiektów<br />

odpowiedzialnychzareakcjęnazdarzeniagry.Wpraktycetooneodpowiadajązainterakcjezinnymiobiektamigry,czyliwkonsekwencjizazachowanieobiektugryod<br />

stronymechanikirozgrywki.<br />

•Controler—Klasaobiektówodpowiedzialnychzaruch.Konkretne,opartenaszablonach,podklasykontrolerapozwalająnaspamiętywanieokreślonejliczbyruchówwtył,<br />

cobędzieistotneprzysynchronizacjiklient-serwer.Kontrolersprawujepieczęnad<br />

modyfikacjąstanufizycznego-PhysicState,któryzkoleiprzechowujewszystkiepotrzebneinformacjeowykonywanymprzezobiektruchu.Samruchjestwykonywany<br />

przezpodklasyPhysicAction,którajestszablonem,wykonującymprzekształceniana<br />

obiekciezadanejklasystanu.<br />

•PhysicData—Klasa,którejobiektyprzechowująstałefizyczneobiektugry.Jegorozmiar,masę,czywartościtarciapotrzebnedookreśleniaparametrówruchu.Koncepcyjnieklasatamiałatworzyćnapodstawieswoichparametrówakcjeprzemieszczania<br />

PhysicAction,jednaktakafunkcjonalnośćniebyłapotrzebawtrakcieimplementacji<br />

gry,choćbyćmożebędzienależałojązaimplementować.<br />

•Player —Ewentualnywskaźnikdoobiektugracza,jeżelitakijestpotrzebny.Tylko<br />

obiektyklasyActor,będącejpodklasąMapObject,mogąbyćkontrolowaneprzezgracza.<br />

•Graphic—Postronieserweraklasatareprezentujeidentyfikatorzasobugraficznego.<br />

Waplikacjiklientataklasasłużyzawarstwękontrolerapomiędzymodułemgraficznym<br />

amodelemgryistanowiuchwytdoobiektugraficznego.Możeonkontrolowaćpozycję<br />

obiektugryorazreagowaćnazdarzeniaanimacyjnegry.<br />

•CollisionProxy—Obiekttejklasyjestreprezentacjąobiektugrywsystemiekolizji.Nie<br />

jestserializowanyijesttworzonyniezależnienakomputerzeklientaiserwera,ajego<br />

działaniejestzdeterminowaneprzezobiektStatsiewentualniekontrolującegogracza.<br />

Wtejchwilisystemkolizjidziaławaplikacjiserweraiwaplikacjiklienckiej,choć<br />

wgrzeniejestzaimplementowanysystemkontrolikolizjipostronieklienta.Niejest<br />

onpotrzebny,choćmógłbysięprzydaćdotestowaniasynchronizacji,jeżelikolizjepo<br />

stronieserweraiklientabysięniepokrywały,woczywistysposóbdowodziłobyto<br />

problemówzsynchronizacją.<br />

Takareprezentacjaobiektugryzwiększyłaskalowalnośćiuniwersalnośćcałegoprojektu.<br />

Jakoprzykładpodamzmiany,którychdokonałempopierwszejiteracjiprojektu,gdypostanowiłemuczynićgomojąpracąmagisterską.Udałomisiępodmienićsamtylkomodułfizyki,nanowy,opartyoobiektkontrolera.Tosamospotkałocałysilnikgraficznyimechanizmkolizji.Wszystkietezmianytylkowniewielkiejczęściwymagałymodyfikacjiwinnych<br />

modułachgry.Klasyreprezentująpewnązamkniętąfunkcjonalność,definiującąkonkretny<br />

aspektfunkcjonowaniaobiektu.<br />

Kolejnąkorzyściąwynikającązpowyższejreprezentacjijestmożliwośćdokonywaniabardzooszczędnejserializacjiobiektu.Byzapisaćobiektdobuforadanych,wystarczyumieścić<br />

27


wnimkolejnejegoobiektyskładowe.Każdyznich,jakożejestreprezentantemkonkretnej<br />

klasy,wiedokładniejakiedanebędąpotrzebne,byodtworzyćlubzaktualizowaćjegostan<br />

przyodczyciezbufora.<br />

Równieżdefiniowanieobiektówodstronydanychgryjestbardzouproszczonedziękipowyższejreprezentacji.Każdaskładowaodpowiadazapewienaspektfunkcjonowaniaobiektu.<br />

Definiującwięcobiektmusimyoddzielnieokreślić-wjakisposóbobiektsięporusza,jak<br />

reagujenazdarzeniainterakcjizinnymiobiektamiiewentualnie,ktojestodpowiedzialnyza<br />

jegokontrolę.Pozwalanamtona:<br />

•Użycieróżnychsposobówporuszaniadlaobiektówotymsamymzachowaniu.Dlaprzykładupozwalanamtonastworzenieobiektureprezentującegostandardowystatekkontrolowanyprzezgracza,anastępniedostosowaniesposobujegoporuszaniadonapędu<br />

konkretnegopojazdu.<br />

•Rozdzielenielogikiporuszaniaodjegoimplementacji.Wtejkwestiitodyskusyjnerozwiązanie,wymagająceprzemyślanegointerfejsumodułufizyki.<br />

•Uwzględnienieaspektówsieciowychwprojektowaniuobiektów.Fizykajestwcałości<br />

poprawniesymulowanawaplikacjiklienckiejijedyniezdarzeniakontrolimająwpływ<br />

naprzebiegsymulacji.Obiektyreakcjinazdarzeniawwiększościwypadkówwymagają<br />

przesyłuwiadomościwodpowiedzinazdarzeniagry.Inaczejujmując,obiektyfizyki,<br />

statystykczykolizjireprezentująfunkcjonalnościwymagająceróżnegotraktowaniaw<br />

mechanizmiesynchronizacji.<br />

3.2.3.Symulacja<br />

Serwerdokonujesymulacjigryużywającdyskretnejjednostkiczasu.Zestałączęstotliwością<br />

dokonujekrokusymulacjiświatagrywykonująckolejno:<br />

1.Ruchuwszystkichobiektówgrywzadanejkolejności.<br />

2.Ruchwszystkichgraczy,cowiążesięzdodaniemnowychakcjidokolejkigry.<br />

3.Rozstrzygnięciawszystkichkolizji,cowiążesięzdodaniemnowychakcjigrydokolejki<br />

priorytetowej.<br />

4.Wykonaniaakcji,któresązaplanowanenatenstanzegaragry.<br />

Wtrakcieruchuposzczególnychobiektówoddzielnierozpatrywanyjestruch(przezobiekt<br />

kontrolera),symulacjaupływuczasuobiektureakcji(turaobiektuStats)orazinnewewnętrznemechanizmykontroliobiektu(jakakcjewewnętrzneobiektu).Jesttoistotneponieważwiększośćobiektówjestwciągłymruchu,wdużymstopniuniezależnymodinnychpodejmowanychprzeznieakcji.<br />

Niemającdoświadczeniawszacowaniukosztuobsługitransmisjisieciowejiwykonywania<br />

głównejpętligry,przezcałyprojektzachowałemmożliwośćkonfiguracjiczęstotliwościczasu<br />

trwaniajednejturygry,jednaktensamczasmusiałamiećturagrynaserwerzeinakliencie.<br />

Istotnejest,żeserwerwłaściwiezkażdąswojąturąmusizmieścićsięwzałożonymczasie.<br />

Gdywczasiekolejnychturprzestaniesięmieścićwdanejjednostceczasusynchronizacja<br />

możezupełniezawieść.Dobrymrozwiązaniemewentualnegoproblemu,możebyćimplementacjamechanizmówzmniejszającychszczegółowośćsymulacjiświatawmomenciegdyserwerzaczynabyćprzeciążony(rzadkietestykolizji,ewentualniewstrzymanieprzetwarzanianiektórychzapytańsieciowych,uniemożliwienielogowaniasięnowychklientów,wyłączenieAI).<br />

28


Drugimmechanizmemktórypowinienemtuzaimplementowaćjestczasowewstrzymywanie<br />

symulacji,rozłączanienadmiarowychgraczyiwznawianiesymulacjiporozwiązaniuproblemu.Jako,żesątobardzouciążliwewimplementacjiitestowaniumechanizmy,ramyczasowe<br />

mojejpracymagisterskiejniepozwoliłyminaichimplementację.<br />

Klientsynchronizujesięzaplikacjąserweraiczaspłynieuniegomożliwietaksamo.Bardzoobawiałemsiętejpełnejsynchronizacjiczasu,czyniebędzietoprzyczynąewentualnejklęskitegoprotokołukomunikacyjnego.Turygrynaklienciesąpodzielonetakąsamądyskretnąjednostkączasu.Wtrakcieobrotugłównejpętligrymodułgraficznyinterpolujestan<br />

obiektówgrypomiędzyaktualnąturąapoprzedniąinajegopodstawiejewyświetla.<br />

Napowyższymodelsymulacjiszczególnywpływmiałaspecyfikamojegoprojektu.W<br />

ustaleniumodelusymulacjiistotnybardzobyłdeterminizm.Właściwyporządeksymulacjizapewniał,żemimoopóźnieńwprzybyciuakcji,któreniszcządeterminizmświata,przyużyciu<br />

kilkudodatkowychmechanizmówmożnazapewnićdostatecznąsynchronizacjęgrypomiędzy<br />

klientemaserwerem.Całasymulacjamusiodbywaćsięwokreślonejkolejnościidentycznej<br />

postronieklientaiserwera.Towłaśniewymaganiewymusiłonaprzykładopóźnienierozstrzyganiaefektówkolizjidoczasuobsługizdarzeńgry.<br />

Wtrakcieprojektowaniasystemunajwiększąjednakuwagępoświęciłemzagadnieniom<br />

sieciowymitoichaspektymiałykluczowywpływnaprocessymulacji.<br />

Aplikacjaklientaiserwera-różnicewsymulacji<br />

Symulacjagrypostronieklientaiserweraróżniąsięodsiebiewkilkukwestiach.Rozwijając<br />

aplikacjeserweramożemyukrywaćprzedklientempewnewłaściwościobiektówsymulacji.<br />

Częstonietylkoniepotrzebujeonwszystkichdanychdotyczącychtychobiektów,alemógłby<br />

onjewykorzystaćdonadmiarowejwiedzy,októrejniepowinienwiedziećgracz.Waktualnej<br />

implementacjiMaelstormnieskorzystałemztejfunkcjonalności,alepierwszawersjagry<br />

zawierałapostronieklientadużomniejsząliczbęinformacjioobiektachreakcji(Stats).<br />

Zdrugiejstronymamyaplikacjęklienta.Zajmujesięonatylkoniewielkimpodzbiorem<br />

obiektówgry,dlategozpunktuwidzeniawydajnościowego,mogęsobiepozwolićnadużo<br />

większąrozrzutność.Zdarzeniagrypostronieklientamogąwywoływaćzdarzeniaanimacji<br />

obiektów,któreprzekładająsięnawizualnyefekt.Mogąteżbyćgenerowanespecjalneobiekty<br />

gry,znajdującesięwyłączniepostronieklientaareprezentującenaprzykładefektygraficzne.<br />

3.2.4.Synchronizacja<br />

Efektem,którychcieliśmyuzyskaćjestzapewnienie,żewszyscypodłączenikliencibędądysponowaliusiebieograniczonymobrazemtegosamego,wirtualnegoświata,któregopełnareprezentacjajesttrzymanaprzezaplikacjęserwera.Byłowielezagrożeń,którebrałempoduwagęrozpoczynającprojektowaniesystemusynchronizacji.Popierwsze,widzianeprzezklientaobiektymogąwchodzićwinterakcjęzobiektamiprzezniegoniewidzianymi.Podrugie,jeżelidowiemysięozmianiestanudanegoobiektuzopóźnieniem,tookażesię,żedostajemy<br />

wiedzęnatematprawdopodobnienieaktualnegojużstanuobiektu,zprzedkilkujednostek<br />

czasu.Natejpodstawiebędziemymusielipróbowaćwywnioskowaćjakijestaktualnystan,<br />

bynieobciążaćserweraniepotrzebnymiprośbamioaktualizacjędanych.Kolejnymewentualnymproblememmogłybyćkwestiebezpieczeństwa,takbyjużnapoziomieprojektowym<br />

zapewnić,żeżadnaaplikacjapodającasięzaklientagry,niebędziewstaniewykonaćakcji<br />

niedostępnychzwykłymużytkownikomizaburzającychrozgrywkę.<br />

Zaimplementowałemfunkcjonalnośćumożliwiającąprzesyłanieobiektówgryprzezsieć.<br />

Jednakwysyłaniecałegostanuwewnętrznegoobiektuprzeczyłozałożeniomstworzeniawy-<br />

29


dajnejkomunikacjiimożliwościobsługibardzodużejliczbygraczy.<br />

Byzapewnićefektywnośćkomunikacjiistotnebyłozminimalizowanieprzesyłudanych,potrzebnychdozapewnieniaspójnościświatagrypostronieaplikacjiserweraiklienta.Ponieważ<br />

grajestsymulowanapoobustronachwdokładnietensamsposób,teoretycznieprzynajmniej,<br />

wpływnajejprzebiegmogłymiećwyłączniezdarzeniawywołaneakcjąużytkownika,bądź<br />

interakcjąobiektów.<br />

Synchronizacjanapodstawiezdarzeń<br />

Istotąkomunikacjijestwięcsynchronizacjanapoziomiekolejkipriorytetowejzdarzeń(obiektówklasyWorldAction).Zdarzeniadzieląsięmiędzyinnyminalokalneiwspółdzielonezapośrednictwemsieci.Każdezdarzeniemożedotyczyćmaksymalniekilkuobiektówgry.Współdzielonezdarzeniazostająrozesłanezserweradowszystkichklientów,którychreprezentacja<br />

naserwerze(obiektklasyUserPlayerposiadającyprzypisanyobiektklasyActor)”widzi”<br />

jedenzobiektówgry,któregodotyczyzdarzenie.Tenprostyiczytelnymechanizmzapewnia,<br />

żeklientjestinformowanyozdarzeniachdotyczącychwidzianegoprzezsiebiewycinkaświata<br />

ijednocześnieniedostajenadmiarowychinformacjioobiektachgryniebiorącychudziałuw<br />

symulacjipojegostronie.<br />

Wdrugąstronęaplikacjaklienckamożeserwerowiwysyłaćwyłączniezdarzeniaokreślająceakcjeużytkownika.Takiepodejściesamowsobiewpływanabezpieczeństwoserwera,<br />

ponieważklientniemożewykonaćwnimakcji,naktórąniezezwalainterfejsudostępniony<br />

przezklasęgracza(wszystkieakcjeużytkownikawyłącznieodwołująsiędointerfejsuklasy<br />

UserPlayer).<br />

Oczywiścienapodstawiesamychzdarzeńnigdyniezapewnimywstuprocentachsynchronizacjiświatabezużyciadodatkowychmechanizmów.Zawszenaszeakcjemogąpoprostunie<br />

przejść,alboprzybyćdoklientazparosekundowymopóźnieniem.Takichsytuacjimożenie<br />

dasięuniknąć,alemoimnadrzędnymcelembyłozapewnienie,bysamaarchitekturaaplikacji<br />

pomagaławporadzeniusobiezproblememspójnościświataisynchronizacji.<br />

Cofanieruchów<br />

Podstawowymproblememwsynchronizacjiświatapoobustronachsąopóźnieniawkomunikacjiorazniedokładnośćwsynchronizacjikolejkigry.Byzminimalizowaćproblemyztym<br />

związanerzeczywistyruchklientawykonywanyjestokreślonyczaspowciśnięciuprzezgracza<br />

przycisku.Czastenpowinienwystarczyćnaprzesłanieinformacjioakcjigraczanaserwer,a<br />

następnierozesłaniejejdoinnych,obserwującychnasgraczy.Nigdyjednakniemamypewności,żekomunikatyzostanąwysłanewwymaganymczasie.Rozwiązaniem,którezastosowałem,byporadzićsobiezzaistniałąsytuacją,jestcofanieruchów.Wpierwszejimplementacjisystemustworzyłemmodelodwrotnejkinematyki,czylikażdaakcjaporuszaniapotrafiłasięrównieżwycofywać.Niestetytorozwiązanieokazałosięproblematyczne.Wbrewpozorom,błędyzaokrągleńmiałybardzodużywpływna<br />

synchronizację.Ponieważwsymulacjiruchuwykorzystywałemmodelfizykinewtonowskiej<br />

wykorzystującejtarcie,prędkośćwtrakcieprzyśpieszaniamiałaograniczeniegórne,doktóregopowolizbiegała.Cofającruchprzyśpieszający,którybyłjużbliskogranicyzbieżności,<br />

zuwaginaniedomiarwartościzmiennoprzecinkowych,zupełnietraciliśmyspójnośćświata<br />

postronieklientaiserwera.Byłtopierwszyproblemtegorodzaju,naktórysięnatknąłem,<br />

alepokazywałonjużsłabąstronętejmetody.Postanowiłemwięcprzepisaćmodułfizyki<br />

nanowo.Tymrazempojedyncząklasęfizykizastąpiłemkontrolerem,tablicąpamiętanych<br />

stanówfizycznychiakcjąfizycznąokreślającąmetodęiparametryruchu.Hierarchiaklas<br />

30


związanazobsługąporuszaniajestprzedstawionawdiagramie3.4.Wużytymrozwiązaniu<br />

obiektspamiętujepewnąliczbęruchówwtył.Jeżelizażądamyodniegocofnięciasiędalej,<br />

grazażądaaktualizacjipozycjipostronieklienta(zarównojeżelicofaliśmyobiektjednejalbo<br />

drugiejaplikacji).<br />

Jeżeliwięcdoklientaprzychodziakcja,którapowinnabyćwykonanawjednejzpoprzednichturgry,klientcofaruchpowiązanychzniąobiektów,następniewykonujeakcje<br />

iponowniesymulujefizykęobiektów.Jeżeliobiektyniemogązostaćwycofanedodanego<br />

momentu,wówczasklientprosiserweroichaktualizację.<br />

Serwerotrzymujewyłącznieakcjeruchugracza.Uznałemzabezpiecznerozwiązanie,w<br />

którymserwerwmomenciedotarciadoniegookilkaturspóźnionejinformacjioruchugracza<br />

samaktualizujejegostanusiebie.Jeżelijednakinformacjabędziezbytspóźniona-wyśle<br />

klientowiżądanieanulowaniawykonanegoruchuiaktualizacjistanuobiektu.<br />

Niezawodność<br />

Rysunek3.4:Obsługaporuszaniasięobiektów.<br />

Powyższysystem,choćzapewniadosyćdobrąsynchronizację,niegwarantujeoczywiściepełnejniezawodnościsieci.Cofanieruchówiopóźnieniawobsłudzewiadomościniszcządeterminizmsymulacjiiwkonsekwencjiichefektysąbardzotrudnedoprzewidzenia.Moimcelembyłotakiezaprojektowaniesystemu,bymożliwerzadkotrzebabyłodokonywaćpełnejaktualizacjiobiektów.Wpraktycejednakrozwiązaniejestwaktualnejwersjigryabsolutniewystarczające.Grającitestującaplikacjęzgrupąznajomychniespotkałemsięzpoważniejszymiproblemamisynchronizacji.Oczywiściemusiałemstworzyćmechanizmy,którezapewniałybymożliwośćodzyskaniasynchronizacjinawypadekjejbraku.Jestgotowerozwiązanie<br />

31


wktórymgraczemożliwerzadkomogąotrzymywaćaktualizacjęobiektów,symulowanychod<br />

relatywniedługiegoczasu.Niejestonewobecnejwersjiaplikacjikonieczne.Gdybyjednak<br />

trzebabyłokiedyśjezastosować,troszkęlepszymrozwiązaniem,alewymagającymimplementacjibardziejskomplikowanegomechanizmu,byłobyproszenieserweroaktualizacjęobiektów<br />

wmomenciezauważeniarozspójnieniagry.Możnabytostwierdzaćnaprzykładanalizując<br />

pokrywaniesiękolizjipostronieklientaiserwera.Tociekawerozwiązaniedoimplementacji<br />

wkolejnychwersjachprojektu.<br />

Dlabranżygiertypowejest,żeniejesteśmywstanietworzyćautomatycznychtestów<br />

większościfunkcjonalności.Niemożemyteżwformalnysposóbudowodnićpoprawnościwielumechanizmów,zwłaszczażesamiczęstoświadomiedecydujemysięnamałeoszustwai<br />

przybliżenia.Jedyniewyczerpującetestyorazopiniezadowoleniagraczymogąpotwierdzić<br />

poprawnośćzastosowanychrozwiązań.<br />

3.2.5.Wnioski<br />

WMaelstormaplikacjaklientamaprzedgraczemukrytewyłączniedane,którychniepowinienonznać,alboktóresąmuzupełniezbędne.Światgrypojegostroniewistotnychdla<br />

niegokwestiachjestodzwierciedleniemświatagrynaserwerze.Odstandardowegopodejścia<br />

różnisiętotym,żeklientjestlustrzanymodbiciemaplikacjiserwera,zamiastpozostawać<br />

jedynieprogramemwizualizującym.Jestjeszczeinnepodejście,stosowanewgrachMMO,<br />

gdziemamyrozdziałnamechanikęwykonywanąpostronieserweraipostronieklienta.Wymagaonotytanicznejpracybyzapewnićprzynajmniejwpodstawowymzakresieuczciwądla<br />

wszystkichgraczyrozgrywkę.Istniejewielezaletmojegopodejściadoroliklientawgrze.<br />

Dlaprzykładu,wsilnikuAurora,naktórymbazowałWiedźmin,serwerbezpośredniorozkazywałobiektowiodtwarzaćdaneanimacjeorazdokonywaćustalonegoruchu.Problememw<br />

tymrozwiązaniujestto,żeobiektypostronieklientataknaprawdęniewiedząjakączynność<br />

właściwiewykonują,mająwiedzętylkootymjaktączynnośćprzedstawić.Możetomiędzy<br />

innymiprowadzićdowysyłaniaaplikacjiklienckiejdodatkowych,nadmiarowychinformacji.<br />

Stosująctopodejście,wyobraźmysobiedlaprzykładusytuacjędrwalarąbiącegodrzewow<br />

świeciegry.Bypoinformowaćotymaplikacjeklienckąmusimywysyłaćoddzielnieinformacjedotyczącekoniecznościwyekwipowaniadrwalawsiekierę,następnieustawićmupozycję,kierunekianimację.Terazustawiamyodpowiedniąanimacjęnaścinanymdrzewie.Noizarazpotemkolejnaseriainformacjigdydrwalścinadrzewo...Drzewoupada...Drwalzbiera<br />

rozrzuconedrewno...Wreszciewrzucajenataczkę,drapiesiępogłowieiidziedodomu...<br />

Wszystkieteczynnościdrwalamożnabyłoprzewidzieć,znająctylkosposóbwjakimbędzie<br />

sięzachowywał.<br />

Obsługaakcjiobiektupoprzezbezpośredniąkontrolęserweranakładateżbardzoduże<br />

ograniczenienaprogramistów.Piszącaplikacjęklientamusząoniokreślaćstanobiektuna<br />

podstawietakichwłasnościjak,dlaprzykładu,jegoanimacja.Pomyłkaibrakpełnejkorelacjipomiędzystanemrzeczywistymobiektu,awłasnościąnapodstawiektórejpróbujemy<br />

gookreślić,prowadzidobardzociężkichwwyśledzeniuinaprawiebłędów.WMaelstorm,<br />

ponieważklientprowadziwłaściwietakąsamąsymulacjęświata,jakadziejesięnaserwerze,<br />

mamynanimdostępdowiększościinformacjiifunkcjonalnościzwiązanychzmechanikągry.<br />

Dużotrudniejtuobłędneokreśleniestanuobiektu.Jeżelitakibłądwystąpi,oznaczaon<br />

brakspójnościdanychgryijesttodużobardziejjednoznaczneiklarownewodnalezieniui<br />

naprawie.<br />

Chciałemteż,bydziękitemu,żemamydoczynieniazjednymsilnikiemgrypoobu<br />

stronachsieci,ułatwionebyłoprogramowanienowychfunkcjonalności.Implementującnowewłasnościgrytworzylibyśmyjewpewnymoderwaniuodmechanizmówsieciowych.Nie<br />

32


jesttoniestetytakieproste.Choćmechanizmy,któretworzymyniemuszaodwoływaćsię<br />

bezpośredniodosieci,ciągletrzebamiećnauwadzesposóbwjakizostaniezapewnionaich<br />

synchronizacja.Architekturazapewnianammocnąbarieręabstrakcjipomiędzytworzeniem<br />

nowychfunkcjonalnościaobsługątransmisjidanychizdarzeńzniązwiązanych,jednakna<br />

każdymetapieimplementacjimusimypamiętać,żetworzymygręsieciowąikażdamodyfikacjasymulacjigrybędziemiałaswojenastępstwawprocesiekomunikacjiizapewnienia<br />

synchronizacji.Wpraktycedyskusyjnejestczyniełatwiejszymwtejkwestiipodejściemjest<br />

standardowerozwiązanie,wktórymtoserwerjestodpowiedzialnyzarealizacjemechanikia<br />

klientwyłączniezawyświetlanie.Wtymkonkretnymaspekcie,standardowepodejściemoże<br />

byćprostsze,ponieważprojektującnowąfunkcjonalnośćpostroniemechanikigry,istnieje<br />

mniejszaszansanato,żewpłynieonanaaspektyzwiązanezsynchronizacjąaplikacji.<br />

Kolejną,pozytywnącechąprojektujestskalowalność.Właściwiewkażdymjegoaspekcie<br />

uważam,żejestdobrzeprzystosowanydoewentualnejrozbudowyczywprowadzanianawet<br />

gruntownychzmian.PróbującdlaprzykładustworzyćnapodstawiesilnikaMaelstormgrę<br />

dlajednegogracza,wystarczytylkowyłączyćobsługęsieciipodpiąćmodułwyświetlający<br />

grafikędoaplikacjiserwera.Skalowalnośćarchitekturyudowodniłemczęściowopodmieniając<br />

wtrakciepracnadprojektemcałekluczowemodułygry(fizykę,kontrolęobiektów,obsługę<br />

sieciorazkilkukrotniemodułgraficzny).Uzyskałemjądziękistosowaniuwirtualnegointerfejsudlaużywanychbibliotekzewnętrznychorazwmiarętrafnemupodziałowiobiektugry<br />

naelementyskładowe,decydująceoróżnychaspektachrozgrywki.<br />

Dyskusyjnymaspektemtechnicznym,jestkompilacjazarównoaplikacjiserweraiklienta<br />

napodstawietegosamegokodu.Wymagatostosowaniadyrektywkompilatoradooddzieleniafragmentówdotyczącychtylkojednejzaplikacji.Zmniejszatoczytelnośćkodu,zwłaszczagłównejaplikacjigry.Mógłbymtenprocesznaczącouprościćtworzącwspólnyinterfejsgłównychklassterującychprzebiegiemgry(GameiWorld)iimplementującgooddzielniepostronieserweraiklienta.Mojerozwiązaniezastosowałembyprzyśpieszyćpracenadprojektem,<br />

poprawićwydajność,byuniknąćnadmiarowegokopiowaniakoduorazdlaautomatycznego<br />

zapewnienia,żesymulacjapoobustronachprzebiegazgodnie.<br />

33


3.3. Implementacjawarstwysieciowej<br />

Implementacjaprotokołukomunikacjibyładlamniebardzociekawymdoświadczeniem.Osobiścieporazpierwszyzmierzyłemsięzzagadnieniamiimplementacjipełnejobsługisieciwgrzekomputerowej.Decydującsięnawybórokreślonychprotokołówkomunikacyjnychitechnologii,opierałemsięnaopiniachznalezionychwartykułachnaktórenatrafiłemwinterneciei<br />

literaturze.Wponiższympodrozdzialechciałempodzielićsięzczytelnikiemdoświadczeniami<br />

iprzemyśleniamizwiązanymiztworzeniemwarstwysieciowejgryMaelstorm.<br />

3.3.1.Wybórprotokołukomunikacyjnego<br />

Wczasachmodemówotransmisji56Kb/sstandardembyło,żegryakcjiwykorzystywałydo<br />

komunikacjiprotokółUDP 6 .Towymuszałoimplementacjęwłasnychmechanizmówzapewnienianiezawodnościsieci.Dopasowanadomechanikigryimplementacjatychmechanizmów<br />

mogłabyćwydajniejszaniżstosowanawTCP 7 ,azuwaginamałąprzepustowośćinternetu<br />

należałojemaksymalniewykorzystać.Minęłojednaktrochęczasu.Zuwaginapopularność,<br />

protokółTCPjużnietylkogwarantujeniezawodnośćtransmisji.Ponieważjestnajpopularniejszymprotokołeminternetowymmabardzomocnewsparcieodstronyarchitekturysieciowej,serwerów,routerówiobsługiścianogniowych.Właściwiewewszystkichopracowaniach<br />

dotyczącychoprogramowaniasieciwgrachsłyszałempodobneargumentyprzemawiająceza<br />

wyboremprotokołuTCPzamiastUDP.Jakociekawostkępodamfakt,żemojewątpliwości<br />

dodatkowopomógłrozwiaćfakt,żeGuildWars,wspominanauprzedniograMMOoprawdopodobnienajwydajniejszejkomunikacjisieciowej,równieżkorzystazprotokołuTCP.<br />

3.3.2.Serializacja<br />

Możliwośćserializacjiideserializacjiobiektówbyłapodstawowąfunkcjonalnością,któraumożliwiłamistworzeniebarieryabstrakcjipomiędzyobiektowymmodelemgryaobsługąsieciopartąostrumienioweprzesyłaniepakietówdanych.WzorowałemprojektsystemunarozdzialeJasonaBeardsleya,któryznalazłemwPerełkachProgramowaniaGier[DLo3].<br />

Przedstawionanadiagramie3.5klasaSerializersłużydozapisuiodczytuobiektówprzed<br />

wysłaniemipoodebraniuichzsieci.Przeciążamwniejmetodyput()iget(),doobsługi<br />

wszystkichpodstawowychtypówwykorzystywanychprzezobiektygry.Dziękitemuserializacjaobiektusprowadzałasiędowywołaniatejsamej,przeciążonejmetody,naprzesyłanych<br />

przezsiećatrybutach.KlasaSerializablereprezentujeobiektygry,któreostateczniechcemy<br />

przenosić.Ponieważdoimplementacjijednolitegointerfejsudozapisuiodczytutychobiektów<br />

przezobiektySerializerużywamszablonów,niemogęużyćdlanichprzeciążonychoperatorów<br />

put()iget().Wywołaniemetodzapisuiodczytuobiektówautomatyczniedobierzewłaściwe<br />

parametrydlaszablonów,więccałośćjestrównieprostawobsłudze.Obiektysąodczytywane<br />

przezSerializerzapomocąklasygry,implementującejinterfejsUnSerializer.Napodstawie<br />

identyfikatoratypu(oznaczającegorodzinęobiektówdziedziczącychniekonieczniebezpośredniopotejsamejnadklasiegry)orazklasy(identyfikującegokonkretnąklasędanegotypu)<br />

jesttworzonyobiektbędącyczystąinstancjądanejklasy.Następnieobiektwczytujeswoje<br />

6 UserDatagramProtocol.Wydajnyprotokółwarstwytransportuwysyłającywiadomościwformiedatagramów.Niegwarantujetego,żewiadomościzostanąodczytanewkolejnościwysłania,mogąteżzostać<br />

odczytanepodwójnielubwogóleniedotrzećdocelu.<br />

7 TransmissionControlProtocol.Protokółwarstwytransportowejwysyłającydanewpostacistrumieniowej.<br />

Nailetomożliwezapewniadostarczeniedanychorazgwarantuje,żezostanąoneodczytanewkolejności<br />

wysłania.<br />

34


Rysunek3.5:Interfejsklasodpowiedzialnychzarealizacjęserializacjiobiektówgry.<br />

atrybutyzbuforadanych,reprezentowanegoprzezobiektklasySerializer.Jestmożliweobsługiwaniepostronieaplikacjiserweraiklientaodczytuwyłącznietychklasobiektów,któredanaaplikacjarzeczywiściemożeodebraćzsieci,cododatkowozwiększabezpieczeństwokomunikacji(ograniczamyjakieklasyobiektówmogązostaćwczytanezapośrednictwemsieci<br />

waplikacjiserweralubklienta).<br />

Powyższymechanizmserializacjimaprostyiskąpyinterfejs.Zajegopośrednictwemmogę<br />

przenosićzłożoneobiektypomiędzyaplikacjąserweraikliencką.Mechanizmwykorzystywałemrównieżwjeden,dyskusyjnysposób.Ponieważzwyklewiempoktórejstronieobiektjest<br />

zapisywanyapoktórejodczytywany,kilkakrotniepozwoliłemsobiekorzystaćztejwiedzy.<br />

Częśćobiektówserweraprzyzapisiedobuforaniezapisujeczęścidanych,którychniechcemyudostępnićklientowi.Torozwiązanieograniczatroszkęskalowalnośćprojektu,alejego<br />

ewentualnapodmiananaogólniejszejestprosta.<br />

Systemserializacjisprawdziłsięwpraktyceznakomicie.Działabezzarzutu,jestbardzo<br />

prostywrozwojuorazwyszukiwaniubłędów.Byłobecnywpierwszejiteracjiprojektui<br />

właściwieodtegoczasuniewielesięzmienił.Funkcjezapisuiodczytutworzysiębardzo<br />

szybkoidziękiprostociewstosowaniubłędywnichzdarzająsięrzadko.<br />

35


3.3.3.Obsługapołączeń<br />

DecydującsięnatworzeniuwarstwyobsługisiecimusiałemzdecydowaćsięcodosposobuobsługipołączeńTCP.Ponieważgramożewzałożeniuobsługiwaćpowyżejsetkipołączeń,nie<br />

mogłemsobiepozwolićnaichsynchronicznąobsługę-cowymuszatworzenieosobnegowątku<br />

doobsługikażdegopołączenia.Zkoleibałemsięjakporadzisobiepojedynczyzbiórgniazdz<br />

obsługąrzeczywiściedużejliczbypołączeń.ZnalazłemartykułwPerełkachProgramowania<br />

Gier[AKi4]dotycząceobsługiserwerawgrachdlabardzodużejliczbygraczy.Autorsugerowałwnim,żegdymusimywgrzeutrzymywaćrzeczywiściedużeliczbypołączeń,najlepszym<br />

rozwiązaniemjestasynchroniczneprzetwarzanieżądańprzezkilkaniezależnychwątków.Dla<br />

liczbypięciusetdotysiącapołączeńmówiłtuopięciuwątkach.Niemającdoświadczeniaw<br />

tejkwestiioczywiściezastosowałemdokładnietorozwiązanie.Połączeniasątrzymaneprzez<br />

obiektyklasyConnectionHandler,będąceabstrakcjądlaprocesuobsługującegoichżądania.<br />

Gdytworzymynowepołączeniesprawdzamyczywszystkieistniejąceprocesyobsługująjuż<br />

pewnąminimalnąliczbępołączeń.Jeżelitakjestorazliczbaprocesówjestmniejszaodmaksymalnieustalonej,wówczastworzonyjestnowyobiektConnectionHandler,uruchamiający<br />

nowyprocesprzetwarzaniapołączeń.Winnymprzypadkunowepołączeniadystrybuowane<br />

sąpomiędzyprocesamitakbyzrównoważyćichrozkład.<br />

36


3.4. Dynamicznewykrywaniekolizji<br />

Potencjalnie,wąskimgardłemmechanikigrymożebyćsystemuporuszaniaiwykrywania<br />

kolizjiobiektów.Zwykletoruchjestnajczęściejwykonywanąprzezobiektyakcjąizwykle<br />

związanyonbyćmusiwłaśniezwykrywaniemkolizji.WprojekcieMaelstormmogłemsię<br />

ograniczyćwyłączniedowykrywaniemkolizjipomiędzyobiektamigryoraztestowaniemwi-<br />

docznościobiektówgryprzezgraczy.Zwyklejednaknawykrywaniekolizjiskładasięcały<br />

zbiórmechanizmów,ściślezależnychodświatagry.Implementacjatychmodułówmakluczo-<br />

weznaczeniedlaaspektówwydajnościowychmechanikigry.<br />

3.4.1.Kolizjeobiektów<br />

Wwypadkutestówkolizjipomiędzyobiektami,naszymzadaniemjeststwierdzenie,żew<br />

danympunkcielubnadanejliniiobiektniekolidujezinnymi.Zwyklesamtestkolizjidwóch<br />

obiektówjestwmiaręprostywimplementacji,ponieważobiektyreprezentowaćmożemyw<br />

przybliżonysposób.Postaciemogąbyćwtrójwymiarowymświeciewalcamiopodstawiekoła.<br />

Jeślipotrzebujemydokładnychkolizji,dowolnychtrójwymiarowychobiektów,zbudowanychz<br />

siatkitrójkątów,równieżdlaprzyśpieszeniapodstawowegotestu,przybliżamyjenajpierwza<br />

pomocąprostej,symetrycznejbryły,takiejjaksześcianalbokula.Jeślibryłyobiektówbędą<br />

kolidowaćzesobą,szczegółowąkolizjęsprawdzamyszukającprzecięćtrójkątówzktórych<br />

zbudowanesąobiekty.<br />

Wtejczęścichciałemskupićsięraczejnasposobachograniczenialiczbyobiektówtesto-<br />

wych.Jeżelidlakażdegoobiektubędziemyprzeprowadzaćtestkolizjizewszystkimipozosta-<br />

łymi,czassamegosprawdzaniakolizjiwturzegrybędziezależnyconajmniejkwadratowood<br />

liczbyobiektów.<br />

Dotestówkolizjiobiektówgrymożnapodejśćdwojako,wzależnościodtegojakiewyma-<br />

ganiafunkcjonalnenakładamynasilniknaszejgry.Możemyliczyćjewszystkieraznaturęgry<br />

wkonkretnymmiejscupętli.Toutrudnia(alenieuniemożliwia)zintegrowaniesystemukolizji<br />

zsystememsztucznejinteligencjiiwykonywanychakcjiobiektów,aleupraszczawymuszenie<br />

determinizmuwnaszejsymulacji 8 .Obiektygrymogąteżsprawdzaćkolizjewewłasnymza-<br />

kresie,cojestdobrymrozwiązaniem,gdypoprostuniechcemywpuścićobiektówwswoją<br />

przestrzeńosobistąiniechcemybybyłysprawdzanekolizjedlaobiektówpozostającychw<br />

spoczynku.<br />

WWiedźminiezastosowanezostałotodrugiepodejście.Obiektyporuszającsięsprawdza-<br />

łyczyniktniestoiimnadrodze.Ewentualnakolizjapowodowałapróbęominięciaprzeszkody<br />

bądźzatrzymaniesię.WMaelstormpołączyłemobarozwiązania.Obiektywykrywająkolizje<br />

wswojejturzeruchu.Wykrytakolizjajestodkładanadotablicykolizji,oileniespowodował<br />

jejwcześniejobiektzktórymkolidujemy.Powtarzaniesiękolizjijestsprawdzanenapodstawie<br />

tablicymieszającej,biorącejpoduwagęwartościfunkcjimieszającejobuobiektóworazturę<br />

gry(czylitablicaautomatycznieresetujesięcoturęgry).Wszystkiekolizjerozpatrywanesą<br />

kolejnowokreślonejczęściturygry.<br />

Sortowanieobiektów<br />

Prostymrozwiązaniemoograniczonejskutecznościjesttrzymanieobiektówgrynaposorto-<br />

wanejwzględemkonkretnejwspółrzędnejliście.TorozwiązaniezostałoużytewWiedźminie,<br />

8 Determinizmwgrzejestistotnąwłasnością,jeżelizdecydujemysięjązapewnićistotnejestuwzględnienie<br />

tegonaetapieprojektowaniapodstawowegosilnikagry.Determinizmmożebyćistotnywsystemachsymulacji<br />

fizyki,grachsieciowychtakichjakMaelstorm,wgrachumożliwiającychzapisywanieprzebiegurozgrywki,czy<br />

cofanieczasugryalboinnemodyfikacjejegoprzebiegu.<br />

37


gdzieliczbaobiektówgryzwyklenieprzekraczałastujednocześniesięporuszających.Oczywistesąograniczeniategorozwiązania.Najczęściejjakolistyużywamyposortowanejtablicy,<br />

przezcododawanieiusuwanieelementówtablicyodbywasięwczasieliniowym.Wzamianza<br />

toinneoperacjezyskująnawydajności(wyszukiwanieelementuiprzeglądanieposortowanej<br />

tablicydziałaszybciejod,dlaprzykładu,implementacjizbiorówang.setzbibliotekiSTL).<br />

Aktualizacjapołożeniawtablicyodbywasięwoczekiwanymczasielogarytmicznym,choć<br />

niemożnawykluczyć,żewpesymistycznymprzypadkuczastenbędzieliniowy.Torozwiązanieprzedstawiłemzuwaginajegoprostotę,niewielkikosztpamięciowyiwwypadkuwielu<br />

projektów,wystarczającąskalęspodziewanejoptymalizacji.<br />

Zastosowaniesiatki<br />

Byzminimalizowaćzbiór,branychpoduwagęprzytestowaniukolizjiobiektów,możemyzastosowaćpodziałświatagrynasiatkę(dlauproszczeniaprzyjmijmy,żejestonadwuwymiarowa)kwadratowych,jednakowychpól.Wkażdejkomórcesiatkiznajdujesięlistaobiektów<br />

mającawniejswójśrodek.Rozmiarkomóreksiatkijesttakdobranydorozmiaruobiektów<br />

gry,żetestkolizjizadanegoobiektu,wymagaprzejściawyłącznielistznajdującychsięwjego<br />

komórceorazkomórkachprzyległych.<br />

Tobardzoskutecznerozwiązanie,problememmożebyćwnimtylkoreprezentacjawiększychobiektów.Możnatozrobić,zmuszającjebyzajmowałyonewiększąliczbękratek,coostateczniemożespowolnićzarównoaktualizacjęjakiwyszukiwaniewidoczności.Jesttodobrerozwiązaniedlagier,wktórychobiektówwiększychodstandardowegobędziezzałożenia<br />

bardzomało.<br />

Drugimsposobemnaobsługęobiektówróżnychrozmiarówjestzastosowanieróżnychpoziomówszczegółowościsiatkikolizji.Najlepiejjestprzyjąć,żekażdypoziomszczegółowości<br />

madwukrotniedłuższąkrawędźpodziałki 9 .Wówczasobiektjestzaznaczanynasiatceodpowiadającejjegowielkościiwszystkichmniejszczegółowych(zwiększąpodziałką).Obiekttestująckolizjęsprawdzająnaswoimpoziomieszczegółowości,poczymtestujejąnawyższychpoziomach,zobiektamiorozmiarachimodpowiadających.<br />

TegorozwiązaniaużyłemprzyimplementacjisystemukolizjiwgrzeMaelstorm.Istnieje<br />

wniejzadanaliczbapoziomówszczegółowościsiatki.Obiektporuszającsięsprawdzakolizjezobiektamiwystępującymiwswoimiprzyległychpolachsiatki.Rozwiązaniewydajesiędziałaćbardzoskutecznie.Podobnegomechanizmuużyłemdosprawdzaniawidoczności.Implementacjasiatkiwidocznościróżnisięmałymiszczegółami.Wposzczególnychkomórkach<br />

siatkitrzymamobiektywinnejstrukturzedanychniżwsiatcekolizji(wzbiorzezamiast<br />

wtablicy).Drugąróżnicąimplementacjisystemuwidoczności,jestfunkcjonalność,wktórej<br />

obiektyniezmieniająswojegopołożeniawsiatce,jeżelitylkominimalnieprzechodząnainną<br />

komórkę(zuwaginadłuższyczasdodawaniaiusuwaniaelementówzwypełnionychobiektamizbiorów).Minusemtegorozwiązaniajestdużezapotrzebowanienapamięć.Szczególnie<br />

tyczysiętosytuacji,gdypróbujemyzastosowaćmałąpodziałkęsiatki,dladużegoświata<br />

gry.Węzełsiatkizwykleniekonieczniejestprostąstrukturąizprzyczynwydajnościowych<br />

powinienmiećzaalokowanąpewnąpamięćnaewentualneobiektywnimprzebywające.<br />

Rekurencyjnegrupowaniewymiarami<br />

Wrócimyterazjeszczenachwilędopomysłusortowaniaobiektów.Opierasięnanimalgorytm<br />

rekurencyjnegogrupowaniawymiarami(RDCRecursiveDimensionalClustering).Dlakaż-<br />

9 Ogólniewodniesieniudosiatkikolizjiistotnejestbyjejkrawędźbyłapotęgądwójki.Dziękitemuwyznaczeniepolasiatkidladanejpozycjisprowadzasiędoprostychoperacjiprzesunięciabitowego.<br />

38


degowymiaruwjakimrozpatrujemyzderzeniabędziemydynamicznietworzyliposortowaną<br />

tablicę.Tablicabędziezawierałaminimalneimaksymalnewspółrzędnenajakichrozpostarte<br />

sąrozpatrywaneobiektygry.Konstrukcjatejtablicyodbywasięwczasieliniowym,sortowaniewczasieO(nlog(n)).Poutworzeniuprzeglądamytablicępróbującwyszczególnićwniejgrupy-czylizbioryobiektówktórychpoczątkiikońcenasiebienachodzą.Tenkrokmożebyćwykonanywczasieliniowym.Następniedlakażdejgrupyrekurencyjniewykonywany<br />

jestkrokRDC,sortującyobiektytymrazemwedługinnejwspółrzędnej.Algorytmzostaje<br />

przerwany,jeżelirozpatrywanagrupajestjednoelementowa,bądźniezostałapodzielonana<br />

mniejszewzględemżadnejzewspółrzędnych.<br />

AlgorytmRDC(RecursiveDimensionalClustering)dlaprzestrzenidwuwymiarowejdziała<br />

wnastępującysposób:<br />

1.Nawejściuzbiórwszystkichobiektówtraktujemyjakogrupę.<br />

2.Tworzymylistęgranicobiektówwedługaktualnierozpatrywanejwspółrzędnej.<br />

3.Sortujemylistęgranic.<br />

4.Napodstawielistygranicdzielimyrozpatrywanągrupęnamniejsze.<br />

5.Dlakażdejodnalezionejgrupyrekurencyjniezałączamyalgorytmanalizująckolejną<br />

współrzędną.Jeżeliniedokonaliśmynowegopodziału,analizujemywedługkolejnej<br />

współrzędnejgrupęwejściową.Jeżelinieudałonamsięrozpatrywanejgrupypodzielić<br />

wedługżadnej,kolejnorozpatrywanejwspółrzędnejkończymydziałaniealgorytmu.<br />

Oczekiwanyczasdziałaniaalgorytmu,dlanobiektów,jestzbliżonydoO(nlog(n))–jeżeli<br />

założymy,żemożemyograniczyćzgóryśredniągłębokośćnajakąalgorytmsięzagłębia.W<br />

pesymistycznymprzypadkumożewzrosnąćdoO(n 2 log(n)),jednakdotyczytosytuacji,które<br />

niepowinnymiećmiejscawrzeczywistychzastosowaniach.<br />

AlgorytmRDCradzisobiedobrzewsytuacjach,wktórychobiektysąwmiaręrównomiernierozrzuconepoświeciegry.Możnagoteżużyćwodniesieniudoobiektówstatycznych,by<br />

grupowaćje,comożebyćnastępnieużytewtworzeniustrukturwspomagającychsprawdzanie<br />

znimikolizji.Algorytmźleradzisobiewmomenciegdywszystkieobiektykolidujązesobą<br />

wzajemnie.Wówczasrekurencjamożeschodzićbardzogłębokoaalgorytmniejestwstanie<br />

rozdzielićobiektównagrupy.Niemiałempraktycznejstycznościzpowyższymalgorytmema<br />

najegodokładneopracowanienatknąłemsięwPerełkachProgramowaniaGier[DLo2] 10 .W<br />

internecieznalazłembardzoróżnorodneopinienajegotemat(odwmiarępozytywnych,do<br />

bardzonegatywnych),dlategowspominamonimgłówniebypokazaćalternatywęwpodejściu<br />

doproblemuwyszukiwaniakolizji.Myślę,żejestdobrymrozwiązaniemdlaprojektów,wktórychobiektysąwciągłymruchuakolizjewykrywamyraznaturęwokreślonejprocedurze.<br />

Przykłademdobrymdowykorzystaniategopodejściamożebyćsilnikfizyczny 11 .<br />

3.4.2.Kolizjezgeometriąświata<br />

Istotnymelementemomawianegomodułujestfunkcjonalnośćtestowaniakolizjiobiektówz<br />

geometriąświata.SzczęśliwiewMaelstormuniknąłemimplementacjitegomechanizmu,jednakmiałemznimsporostycznościwtrakciepracnadWiedźminem.Trzebapamiętać,że<br />

10<br />

Inne opracowanie algorytmu można znaleźć na stronie: http://lab.polygonal.de/articles/recursivedimensional-clustering<br />

11<br />

Oboksilnikówgraficznych,fizykajestmodułemgrynajczęściejimportowanymodzewnętrznychdystrybutorów.NarynkukomercyjnymnajbardziejznanymisąsilnikiHavokPhysicsorazPhysXfirmyAGEIA.<br />

39


geometriaświatagryjesttworzonazwyklezmyśląowyświetlaniujejiwpraktycemożebyć<br />

bardzoskomplikowana.Światgryskładasięzwyklezolbrzymiejliczbyopisującychgotrójkątów,któretylkowniewielkimstopniusądlaprowadzonegoprzezgraczabohaterapodłogąalbościaną.Testowaniekolizjiztakskomplikowanągeometriąmożebyćstanowczozbytkosztowne.Dlategowgrachpopularniewprowadzasiędodatkowągeometrię,generowanąbądź<br />

tworzonąprzezgrafików.Najczęściejmaonapostaćsiatkinawigacyjnej.Jesttogeometria<br />

złożonaztrójkątów,którawyznaczapowierzchniępoktórejmogąporuszaćsięobiektygry.<br />

Możejąwyznaczaćdokładnie,takżepozycjaznajdującychsięnaniejobiektówjestustalanawyłącznienapodstawiegeometriinawigacyjnej.Wysokośćmożebyćteżpobieranazz<br />

bardziejszczegółowejgeometriiświata.Torozwiązaniejestpreferowane,ponieważpozwala<br />

nauproszczeniegeometriinawigacyjnej.Wkonsekwencjiprowadzitodoprzyśpieszeniapozostałychoperacjiwykonywanychnaniejorazułatwiajejwyznaczanieprzezprojektantów<br />

gry.<br />

Dlakażdegotrójkątamusimymócpodaćwczasieliniowymtrójkątyznimsąsiadujące.<br />

Wówczas,dziękizastosowaniugeometriinawigacyjnejkolizjepostacizkrawędziamiświata<br />

możnaliczyć,biorąctrójkątsiatkinawigacyjnej,naktórymznajdujesiępostać.Następnie<br />

przeszukujesięwszerztrójkątysiatkinawigacyjnejleżącepodobrysempostaci.Jeżelinatrafimyna”dziurę”(braksąsiada),bądźtrójkątpoktórymniepowinniśmychodzić,oznaczato,że<br />

wychodzimypozaświat.KosztczasowytakiegorozwiązaniajestrzęduO(log(n)+mlog(m)),<br />

gdzientoliczbatrójkątówsiatkinawigacyjnej(kosztwyszukaniastartowegotrójkąta),amto<br />

liczbatrójkątówleżącychpodtestowanymobszarem(kosztprzeglądaniawszerzalgorytmem<br />

Dijkstry).<br />

Zastosowaniegeometriinawigacyjnejtooczywiściepewnadodatkowa<strong>praca</strong>,którąmusiwykonaćdziałprzygotowującylokacje,naktórychtoczysięgra.Jednakdziękiniejpoza<br />

przyśpieszeniemwykrywaniakolizji,uzyskujemymożliwośćkontrolowaniaobszarupojakim<br />

zezwalamyporuszaćsięgraczowiorazunikamyproblemówzwiązanychzniewłaściwąinterpretacjągeometriiświataprzezsilnikgry.<br />

WWiedźminiesiatkanawigacyjnabyłatworzonaprzezgrafikówiokreślałaobszarpo<br />

którymmożnasięporuszać.Wysokośćpostaciwdanympunkciebranabyłajednakzgeometriikolizyjnejświata,ajejodległośćodgeometriinawigacyjnejwpioniemogławynosićco<br />

najwyżejpółmetra(wmetryceświatagry).<br />

3.4.3.Wnioski<br />

Nieomówiłembynajmniejwszystkichaspektówzwiązanychzwykrywaniemkolizji.Starałemsięprzybliżyćparępodstawowych,popularniestosowanychrozwiązań.Implementacja<br />

sprawnego,dostosowanegodoświatagryiwymagańprojektu,systemukolizjijestbardzo<br />

istotna.Gdyużyjemynarzędziprofilujących,pozwalającychśledzićczaswykonaniakonkretnychfunkcjiwczasiedziałaniagry,zobaczymyżewydajnośćmodułówwyszukiwaniaścieżek<br />

iporuszaniajestzwykleściślezależnaodsystemukolizjizktóregokorzystają.Systemkolizji<br />

jestnierozerwalniepowiązanyzreprezentacjąświatagrywkodzie.Dlategotworzącambitny<br />

projektistotnejestbyoprzećgonamocnychpodstawach,awichskładwchodziwłaśnie<br />

odpowiedniowydajnysystemwykrywaniakolizji.<br />

40


3.5. Wyświetlaniegrafiki<br />

ModułwyświetlaniagrafikiMaelstormOnlineniebyłdlamnienajistotniejszymelementem<br />

gry.Niesiliłemsięnaoptymalnewykorzystaniemocyobliczeniowejprocesoraorazdostępnej<br />

pamięcioperacyjnej.Piszącgostarałemsiębybyłmożliwieskalowalnyiniezależnyodpozostałejczęścikodu.Starałemsięuczynićinterfejspomiędzymechanikągryajejwyświetlaniem<br />

możliwieprostyijednoznaczny,jednocześnieumożliwiającjegopodmianęorazrozbudowę.<br />

Rysunek3.6:Interfejspomiędzygrąazewnętrznymibibliotekami.<br />

3.5.1.Interfejsmoduługraficznego<br />

Założeniem,któregoprzestrzegałemwimplementacjiMaelstormbyłomaksymalneograniczenieinterfejsuzewnętrznychbibliotekzkodemaplikacji.Wyjątekstanowiłybibliotekinarzędziowe(BOOSTiSTL)ibibliotekasieciowaasio.Importującpozostałebibliotekitworzyłem<br />

klasęgrymającąmaksymalnierozbudowanąuniwersalnąfunkcjonalnośćipozostawiającą<br />

wirtualnyinterfejs,którypowinienbyćzdefiniowanyprzezkonkretnąbibliotekę.Wkodzie<br />

gryodnosiłemsięwyłączniedoabstrakcyjnejklasyprzesłaniającejfunkcjonalnośćopartą<br />

ozewnętrznebiblioteki.Diagramklas3.6przedstawiametodologięimplementacjibibliotek<br />

którązastosowałemwkodzieaplikacji.<br />

Taarchitekturasprawdziłasięjużwielokrotnie.Proporcjonalniebardzomałymnakładem<br />

41


siłpodmieniałemjużcałymodułwyświetlania.Najpierwpierwsząimplementacjęsystemu<br />

wyświetlanianamodułOgre3d.Późniejzprzyczynwydajnościowychzredukowałemwyświetlaniestanugrynaserwerze,dotekstowegowyświetlaniawkonsolizapomocąbiblioteki<br />

pdCurses.<br />

3.5.2.Animacja<br />

SystemanimacjiwMaelstormpowstałwkońcowymokresiepracnadprojektem.Projektując<br />

gomiałemnauwadzebłędyleżąceupodstawanalogicznegosystemuwgrzeWiedźmin.Był<br />

onpozostałościązAurory,staregojużsilnikaktórystanowiłbazęgry.CałymechanizmwyświetlaniawWiedźminiezostałnapisanynanowo,leczpewneelementystarejarchitektury<br />

pozostały.Jednymznichbyłwłaśniesystemanimacji.AurorabyłasilnikiemNeverwinter<br />

Nights,chybapierwszejwpełnitrójwymiarowejgryRPG.Byłatograoferującamożliwość<br />

grywieloosobowej,takwięcwkodziemieliśmyaplikacjęnapisanąwarchitekturzeklientai<br />

serwera.TenrozdziałzostałzachowanywWiedźminie.Zpoczątku,byumożliwićewentualne<br />

stworzeniegrywieloosobowej.Późniejgdyprojekturósł,byłozbytpóźnonamodyfikacjetak<br />

fundamentalnychelementówsilnika.Dziękitemu,mimożeniepracowałemnadWiedźminem<br />

odpoczątku,miałemstycznośćzrozwiązaniamikwestiigrydlawielugraczyużytymiwNeverwinterNights.Systemanimacjibyłprojektowanyzuwzględnieniemkoniecznościobsługi<br />

wydajnejkomunikacjisieciowej.<br />

Chciałemwięcuniknąćbłędówprojektowychsystemuanimacji,zktórymimiałemstycznośćwpracyzawodowej.Pierwszymznichbyłoustawianieanimacjiobiektówklientaprzez<br />

serwer.Tąkwestięomówiłemdokładniejwsekcji3.2.Kolejnymproblememwystępującym<br />

wWiedźminiebyłasamareprezentacjaanimacji.Zdarzenieanimacjiwysyłanesieciąmiałopostaćliczbycałkowitej,identyfikującejkonkretnąanimację.Niestetyniestworzyliśmy,<br />

żadnegospójnegosystemupobieraniadodatkowychdanychdotyczącychanimacji,zadanej<br />

wpostaciidentyfikatora.Toprowadziłodotego,żesprawdzeniedodatkowychinformacjio<br />

animacji,określonejliczbącałkowitą,implikujewywołaniejednejzfunkcjiwypełnionychalbo<br />

gigantycznymblokiemswitchalbociągiemniepotrzebnychporównań.Ponieważpewneanimacjemusiałybyćtraktowanewsposóbwyjątkowy,funkcjeustawiającejepostronieklienta<br />

byłyniesłychanieskomplikowane,wypełnionepotężnąliczbąporównań,częstopoczęścijuż<br />

niepotrzebnych.Wsystemieniesposóbbyłoodróżnićmartwy,nieużywanykododrzeczywistychrozwiązańrzadkowystępującychbłędów.Jakiekolwiekzmianywogólnymsystemie<br />

animacjibyłyniemożliwe,ponieważniktniepanowałnadjegokodem.Każdamodyfikacja<br />

groziłazawszepoważnymibłędami,mogącymiwystąpićwzupełniewyjątkowychsytuacjach.<br />

Systemanimacjibyłtunagranicyskalowalności,ewentualnepróbyjegonawetnajmniejszej<br />

rozbudowybyłybardzotrudnedoprzeprowadzenia.<br />

Wymaganiasystemuanimacji<br />

Projektującmójsystemchciałemwięcbybyłon:<br />

•Jaknajbardziejczytelnyiskalowalny.<br />

•Chciałembyodstronymechanikigryjegoobsługabyławyjątkowoprostaijednoznaczna.<br />

•Jednocześnieobciążałemtensystemdużąodpowiedzialnościąodnoszącąsiędograficznejstronymojejgry.Interfejsanimacjimiałumożliwićuzyskaniewjednolitysposób<br />

bardzoróżnorodnychefektówgraficznych.Odstandardowejobsługianimacjimodeli,<br />

42


przezprzezroczystośćdowolnychobiektówgraficznychażdowyświetlaniaefektówcząsteczkowychwrodzajueksplozji.<br />

•Chciałemteż,bynaobiekciemogłydziałaćnarazróżneanimacje,ajednocześnieniektóreznichpowinnysięwykluczać.<br />

Realizacja<br />

Rysunek3.7:DiagramklasprzedstawiającysystemanimacjiMaelstorm.<br />

WMaelstormOnlineanimacjesąidentyfikowanezapomocąliczbycałkowitej.Diagramna<br />

ilustracji3.7przedstawiapodstawowąhierarchięklasodpowiedzialnązaimplementacjęsystemuanimacji.ObiektyAnimationsązgrupowanewtablicyanimacjiaidentyfikatoranimacji<br />

jestwniejindeksem.Potrafiąonetworzyćkonkretnąreprezentacjęanimacji,działającejna<br />

obiekcie.Przechowująteżogólnedanedotyczącereprezentowanegotypuanimacji.ObiektyRunningAnimationnatomiastsąinstancjamianimacjinaobiekciegraficznym.Potrafią<br />

naniegodowolniewpływać,nawettworzącinneobiektygraficzne.Dlaprzykładu,animacja<br />

efektucząsteczkowegotworzyobiektefektuwmiejscuwktórymznajdujesięposiadającyją<br />

obiektgraficzny.<br />

Korzyścijakiepłynązpowyższejarchitektury:<br />

•Dziękiobiektowejstrukturzeizastosowaniudziedziczeniamożnabardzołatwoobsłużyć<br />

wspecjalnysposóbnietypoweanimacje,wymagającespecjalnegotraktowania.<br />

•Byuprościćinterfejsmodułuanimacjiobiektygrywpływająnaanimacjęinformując<br />

swojąreprezentacjęgraficznąozdarzeniuanimacyjnym.Możebyćonoobsłużoneprzez<br />

43


odpowiadającymuobiektgraficzny.Tozawężainterfejsanimacjidowywołaniajednej<br />

tylkofunkcji.<br />

•Animacjemogąwywoływaćsięnadowolnychobiektachgraficznych.Dziękizastosowaniuszablonówmogąteżkorzystaćzichspecyficznej,niewirtualnejfunkcjonalności.<br />

•Naobiekciemożenarazdziałaćwieleanimacji.Jednocześnieanimacjamożeposiadać<br />

referencjędozbioruanimacjiwykluczanych,którebędąwówczaszdejmowanewrazz<br />

jejaplikacjądoobiektu.<br />

44


3.6. Pathfinding-wyszukiwanieścieżek<br />

Wyszukiwanieścieżektoistotnymechanizm,zktórymmusząuporaćsięprogramiściwiększościgier.WMaelstormOnlineświatemgryjestotwartaprzestrzeńkosmiczna,wktórejbrakwiększychprzeszkód”terenowych”,awzajemneomijaniesięobiektówopartejestnaprostychmechanizmach,októrychnapiszęwdalszejczęścipracy.Wtensposóbominęłamnie<br />

koniecznośćimplementacjimodułuwyszukiwaniaścieżek,będącaczęstobardzopracochłonna<br />

ikosztowna.<br />

JednakwprojekcieWiedźmin[TW07]osobiścieodpowiedzialnybyłemszczególniezasystemwyszukiwaniaścieżek.Wtymrozdzialechciałemwięcpodzielićsięwiedząiprzemyśleniamizdobytymiwtrakciepracyzawodowejorazwtokuwłasnychposzukiwańdotyczących<br />

całościowegorozwiązaniaomawianegoproblemu.<br />

3.6.1.Definicjaproblemu<br />

Stajemyprzedproblememwyszukaniaścieżkidladanegoobiektugry,pomiędzydwomapunktamiwprzestrzeni,lubstwierdzenia,żeścieżkajestniemożliwadouzyskania.Trzebatujednak<br />

pamiętać,żeświatygryróżniąsiępomiędzysobą,wdodatkucechujejezwykledynamika.W<br />

dodatkuzupełnieinnymproblememwpraktycemożeokazaćsięominięciestojącegonamna<br />

drodzestołu,ainnym,przeprowadzeniepostacipomiędzydwomapunktaminaprzeciwległych<br />

krańcachwirtualnejlokacji.Inaczejujmującsystemwyszukiwaniaścieżekmożeskładaćsięz<br />

kilkuróżnychmechanizmów,skutecznychwróżnychsytuacjach,przyróżnychdługościachi<br />

stopniachkomplikacjiścieżkiwynikowej.<br />

Częstozuwaginazłożonośćświatagrysystemwyszukiwaniaścieżekmusibyćmocnozintegrowanyzsystememsztucznejinteligencjiikonfigurowalnyzapomocąnarzędziiskryptów<br />

gry.Oewentualnejpotrzebiekonfiguracjisystemunapiszęwtrakcierozważańnadaspektami<br />

ocenyrozwiązań,tujużjednakchciałbymzaznaczyć,żewyszukiwanieścieżekniejestwyłącznieproblememalgorytmicznym,aleczęstozwiązanejestzdodatkowąorganizacjąprocesu<br />

pracynadlokacjamiświatagryiimplementacjąfabuły.<br />

Aspektyocenyrozwiązania-realizm<br />

Podstawowymkryterium,wjakimsystemwyszukiwaniaścieżekoceniaćbędziekońcowyużytkownikjestintuicyjnośćznalezionychprzezniegorozwiązań.Gdygraczgdzieś”kliknie”,to<br />

liczy,żepostaćpójdziedotegomiejscawtensamsposóbjakonsambytozrobił.Będzietood<br />

programistywymagałowzięciapoduwagęwieluróżnychczynników.Popierwsześcieżkamusi<br />

byćintuicyjniewygładzonaipozbawionanagłych,nienaturalnychzwrotów.Owygładzaniu<br />

ścieżeknapiszęponiżejkilkasłów.Kolejnymistotnymelementembędzienapewnoukształtowaniaterenu,czynawierzchni.WWiedźminienaprzykładproblemem,którywyszedłw<br />

trakcieprac,byławoda.Wsilnikubyłaonawyłącznieefektemgraficznym,niemającym<br />

wpływunamechanikęgry.Brodzeniepowodzieprzezkorowodypostaciwyglądałojednak<br />

wyraźnienienaturalnie.Trzebabyłotouwzględnićipostacie,nailetobyłomożliwe,chodziłypostałymgruncie,wybierającwodnąlokacjętylko,gdymogłotowyraźnieskrócićdrogę.Czynnikówtakichwkażdejprodukcjimożeznaleźćsiębardzodużo.Mogątobyćnaprzykładdrogi,którychpostaciepowinnysiętrzymać,mimożemogąoneniemiećkonkretnego<br />

wpływunaporuszaniesiępostaci.Mogątoteżbyćprzeszkody,którychpokonanienietylko<br />

zabieradodatkowyczas,aleintuicyjniedlagraczazwiązanejestzwysiłkiem.TudlaprzykładurównieżkłaniasięWiedźmin.Wgrzemożnasiębyłowspinaćnaniewielkiewzniesienia.<br />

Animacjawspinaniabyłaszybka,jednakzbytczęstewspinaniesięczyzeskakiwaniewyglą-<br />

45


dałopoprostunierealistycznie.Dlategotrzebaichbyłounikaćbardziej,niżwynikałobytoz<br />

samegospowolnieniamarszu.<br />

Ważnemożebyćteżwieledodatkowychmechanizmów.Jakoprzykładpodamefektpo-<br />

ruszaniasiępostaciprawąstronądrogiczychodnika.Zastosowanietakiegorozwiązaniaw<br />

miastachnietylkowpływanawrażenierealizmuświatagry,alerównieżzmniejszaczęstotli-<br />

wośćomijaniaikolizjipostaci,cowperspektywiemożemiećwpływnapoprawęwydajności<br />

gry.<br />

Aspektyocenyrozwiązania-konfiguracja<br />

Zastanówmysięteraznaddynamikąświatagry.Stwarzaonaproblemy,którewwiększości<br />

powinnyzostaćprzewidzianeirozwiązanejeszczewtrakcieprojektowaniasystemuwyszuki-<br />

waniaścieżek.Naprzykładprzywyszukiwaniuścieżeknawiększyodkilkukrokówdystans,<br />

niepowinniśmyzupełniebraćpoduwagęinnychpostaci-gdyżgdyznajdziemysięwich<br />

sąsiedztwieonezdużymprawdopodobieństwembędąwzupełnieinnympołożeniu.Skoro,<br />

niebierzemydynamicznieporuszającychsiępostacipoduwagę,topojawiasiękolejnynie-<br />

trywialnyproblemdorozwiązania,amianowiciestworzeniemechanizmuomijania.Topewien<br />

dodatkowyelement,istotnyszczególnie,gdyprzestrzeńgryjestgęstowypełnionapostaciami.<br />

Aletoniejedynyproblemzwiązanyzdynamicznąnaturąświatagry.<br />

Byopisaćbardzoistotnywwieluprodukcjachaspektproblemu,przyjrzyjmysięabs-<br />

trakcyjnej,hipotetycznejsytuacji.Wyobraźmysobie,żejesteśmywbudynku,naparterze.<br />

Chcemydostaćsiędopokojunapiętrze.Jednakklatkaschodowajestzamknięta,ijedynym<br />

sposobemnadostaniesięnakolejnepiętrojestwinda.Amożejestwłaśnienaodwrót...Roz-<br />

wiązanieproblemuwydajesięproste-naszsystemwyszukiwaniaścieżekpowinienwiedzieć<br />

jakdziaławindaidokądmożenasprzenieśćorazbraćpoduwagęfakt,żedrzwimogąbyć<br />

zamknięte.Acojeśliwindajestzepsuta?Oczywiściesystemiztymmusisobieporadzić.Ele-<br />

mentówpodobnychwdziałaniudonaszejwindymożebyćwgrzebardzodużoiwieleznich<br />

możebyćzaimplementowanychprzezprojektantówpoziomównapodstawiedużobardziej<br />

ogólnychmechanizmów.Działanietakichobiektówmożeopieraćsięnaskryptach,awówczas<br />

ichefektciężkoprzewidziećwkodziegry.Możeonotakżepowodowaćtrójwymiarowyruch<br />

obiektów,któregokonsekwencjeteżmogąbyćpraktycznieniemożliwedoprzewidzenia.W<br />

praktycezdarzasię,żemającwkodziesamobiektwindy,nietylkoniebędzietrywialneokre-<br />

ślenieczytawindadziała,aletakżezorientowaniesięjakonadziała,gdziemożenasprzenieść<br />

iczywogólepowinnabyćbranapoduwagęwsystemiewyszukiwaniaścieżek.Praktyczny<br />

przykładpowyższejsytuacjimożnaznaleźćwsilnikuUnrealEngine 12 .Obiektyinteraktywne<br />

sąwnimreprezentowanejakoruchomageometria,którapodwpływemzdarzeńgryporu-<br />

szasięwdowolnysposóbwtrójwymiarowymśrodowisku.Ichruchmożebyćspowodowany<br />

akcjądowolnego,wywoływanegowgrzeskryptu.Niedość,żewtakimsystemieciężkojest<br />

stwierdzićcowłaściwierobiobiektwindy(trzebawpaśćnato,żenależywejśćdojejśrodka),<br />

tojeszczewłaściwienierozwiązywalnymproblememjestanalizawspółzależnościobiektówi<br />

skryptówgry.<br />

Ważnymaspektemocenysystemuwyszukiwaniaścieżekjestmożliwośćjegokonfiguracji<br />

zapośrednictwemnarzędzi.Wgruncierzeczy,jesttopodstawowerozwiązaniepostawionego<br />

wyżejproblemu.Popierwszemożenamtoumożliwićspecjalnetraktowanieobiektówtakich<br />

jakwspomnianaprzeznaswindaizamkniętedrzwi.Dobrzenapisanysystemwyszukiwania<br />

ścieżekpowinienumożliwićprojektantowipoziomuwpływanienaswojedziałaniezuwzględ-<br />

12 UnrealEngine—silnikgry,produkcjiEpicGames.KolejnegeneracjeUnrealEngiepowstająnabieżąco<br />

istanowiąawangardęnowychtechnologiiwdziedziniekomputerowejrozrywki.Aktualniejestdostępnana<br />

rynkutrzeciageneracjasilnika-UnrealEngine3.<br />

46


nieniemsytuacjifabularnychorazmechanikąfunkcjonowaniaobiektówetapu-oczywiście<br />

jeżelitakiemożliwościoferujenaszagra.<br />

Jestjeszczejedenproblem,którywynikazbrakumożliwościkonfiguracjisystemu.System<br />

jakotakibędziemusiałdziałaćwcałejgrze,adoprogramistynadchodzićbędąbłędydotyczącespecyficznychmiejscświatagryisytuacji.Poprawienietychbłędówspowodujezmiany<br />

globalne,dlategomożliwejestpojawieniesięnowychproblemów.Błędyzresztąmogąnieleżeć<br />

postronieprogramisty.Możliwe,żebłędnesąnaprzykładdanegeometrycznelokacjigry,ale<br />

jeżeliprojektanciitesterzyniedostanąnarzędzipomagającychimkonfigurowaćiobserwować<br />

działaniesystemuścieżek-błędyzakażdymrazembędąprzechodzićprzezprogramistę.<br />

Niedotyczytojednakwszystkichprodukcjiispecyfikasystemuwyszukiwaniaścieżekoraz<br />

użyterozwiązaniapowinnybyćdopasowanedoświatagryorazmechanikirozgrywki.Konfiguracjasystemuścieżekjestpotrzebnawgrach,wktórychporuszaniepostacijestkluczowym<br />

elementem,iwktórychświatgryjestściślezależnyodprojektantówlokacjigry,aniejesttak<br />

prostokonfigurowalnyprzezgracza.Szczególniewgrach,wktórychporuszamysiępootwartychprzestrzeniachimamydużąswobodąruchu,konfiguracjasystemuwyszukiwaniaścieżek<br />

jestdyskusyjna.Nakładanietakiegoobowiązkunaprojektantówiimplementacjanarzędzido<br />

tegoceluwydająsięwówczaszupełnieniepotrzebne.<br />

3.6.2.Wydajność<br />

Wyszukiwanieścieżekpotencjalniemożebyćwąskimgardłemwydajnościaplikacjigry.Jeżeli<br />

dużoobiektówporuszasiępolokacjigryjednocześnie,każdycojakiśczasbędziewymagał<br />

uwagisystemuwyszukiwaniaścieżek.Dodatkowo,tejuwagiobiektymogączęstowymagać<br />

właśniejednocześnie-gdyjakaśgrupaobiektówjestwpodobnejsytuacjiinajejpodstawie<br />

decydujesiępodjąćakcjęzwiązanązporuszaniem.Ważnejestwięc,byzapewnićmechanizmy<br />

równoważąceobciążenieobliczeniowewywołanedziałaniemsystemuwyszukiwaniaścieżek.<br />

Dwapodstawowerozwiązania,zktórymimiałemwtejkwestiistycznośćto:<br />

1.Wielowątkowość—systemwyszukiwaniaścieżekdziaławewłasnymwątku.Dostaje<br />

odobiektówgryzlecenianawyszukiwanieścieżekirealizujejeniezależnieodgłównej<br />

pętligry.Pozaprostotą,dodatkowązaletątegorozwiązania,szczególnieteraz,gdystandardemstająsięmaszynywielordzeniowe,jestmożliwośćwykorzystaniadodatkowychjednostekobliczeniowych.Naniekorzyśćtegorozwiązaniaprzemawiazaśto,żebezimplementacjidodatkowychmechanizmów,tosystemoperacyjnybędziedecydował,ile<br />

czasunaszaaplikacjapoświęcinawyszukiwanieścieżek.<br />

2.Ograniczonyczasruchu—torozwiązaniebyłoużytewWiedźminie.Obiektgry<br />

dostajeograniczonąjednostkęczasunawykonanieruchu.Jeżeliwyszukiwanieścieżek<br />

niezmieścisięwnim,stanwyszukiwaniajestzapamiętywanyiobiektrozpoczniewyszukiwanieodtegomomentuwnastępnejramce.Minusemtegorozwiązaniajestfakt,żejestonoszczególniezależneodprędkościkomputerainasłabszymsprzęcieprzydzielanyczasmożepozwalaćnamniejsząliczbękrokówalgorytmu,coprzymniejszejliczbie<br />

klatekpowodujeczasamiolbrzymiwzrostdługościczasuwyszukiwaniaścieżek.<br />

3.6.3.A*<br />

PodstawąwiększościsystemówwyszukiwaniaścieżekjestalgorytmA*,sprowadzającysię<br />

dowyszukiwaniewszerzalgorytmemDijkstry,gdziewierzchołkamigrafuwyszukiwaniasą<br />

punkty,bądźobszaryprzestrzenigry.Algorytmdziałaczęstonakilkuróżnychpoziomach<br />

wzależnościodtegojakieodległościrozpatrujemy.Ometodziereprezentacji,tworzeniai<br />

47


konfiguracjigrafuwyszukiwanianawiększeodległościnapiszęwnastępnychpodrozdziałach.<br />

Tunatomiastchciałbymwspomniećjeszczekilkasłównatematwyszukiwaniaścieżkina<br />

stosunkowomałychodległościach,gdymusimyodnaleźćdokładnądrogę,którąmusiprzebyć<br />

postaćzuwzględnieniemwszystkichprzeszkódterenowych.<br />

Dlauproszczeniaprzyjmijmy,żewyszukujemyścieżkęnapłaszczyźniedwuwymiarowej,do<br />

czegozresztą,zwykleproblemjestsprowadzany.Jakowęzływyszukiwaniamożemyużyćsta-<br />

łegoirównomiernegopodziałupłaszczyzny,naprzykładsiatkikwadratowej,lubnawigacyjnej<br />

(patrzrozdział3.4.2).Innymrozwiązaniemjestutworzenielogicznej,leniwej 13 przestrzenidla<br />

danegowyszukiwania(wktórejreprezentacjawęzłówgrafuwyszukiwaniapowstajedopierow<br />

momenciewzięciaichpoduwagęprzezalgorytmprzeszukiwania,jakoewentualnenastępni-<br />

ki).Najprościejjestwówczasprzyjąćpunktpoczątkowyikońcowywyszukiwanejścieżkijako<br />

punktyodniesieniadlatworzonejprzestrzeni.WierzchołkigrafuwyszukiwaniaA*będąlogicz-<br />

nieprzyporządkowanepunktomterenuznajdującymsięnakratownicyozadanejpodziałce.<br />

Wierzchołkimogąmiećleniwąreprezentację,toznaczymogąpowstawaćdopierowmomen-<br />

ciedojściadonichalgorytmuwyszukiwania.Pomiędzywierzchołkamigrafuwyszukiwania<br />

będzieistniałakrawędź,jeślibędziemywstanieprzeprowadzićpomiędzyreprezentującymi<br />

jepunktamiobiektdlaktóregowyszukujemyścieżkę.Wielkośćpodziałkimożnadostosować<br />

dowymaganejszerokościdrogi,odległościpunktówkrańcowychczyukształtowaniaterenu.<br />

Jesttobardzoważnywybór,ponieważtoodwielkościpodziałkizależyrozmiarprzestrzeni<br />

wyszukiwania.Stosujączbytdużykrokpodziałkialgorytmmożenietrafićnawłaściweroz-<br />

wiązanie.Problempojawiasię,gdyświatgryjestzróżnicowanyimamydoczynieniazarówno<br />

zwąskimiprzejściami,ciasnymipomieszczeniamiorazrozległymiotwartymiprzestrzeniami.<br />

Bardzoprostym,askutecznymrozwiązaniem,którezastosowałemwWiedźminie,byłady-<br />

namicznazmianawielkościpodziałki.Użyłemprostejheurystyki,którąoczywiściemożna,<br />

myślę,zastąpićcelniejszą.Zakażdymrazem,gdyalgorytmodniósłsukceszwiększałemdwu-<br />

krotniepodziałkę.Gdyalgorytmnieznalazłścieżkipodziałkazmniejszanabyładwukrotnie,<br />

ażdoustalonegolimitu,aszukaniebyłopowtarzane.Ponieważkażdykrokzwiększał,bądź<br />

zmniejszałwykładniczoprzestrzeńwyszukiwaniaczaswyszukiwaniarozwiązaniaprzywięk-<br />

szejpodziałcebyłpomijalnywstosunkudodokładnegowyszukiwania.Heurystykaniebyła<br />

idealna,bonieuwzględniałanaprzykładsytuacji,wktórychpostaćniemogładojśćdocelu<br />

gdyżpodziałkabyłazamała(byłlimitliczbyodwiedzonychprzezprzeszukiwaniewęzłów),<br />

aleogólniedobrzesprawdzałasięwpraktyce.Dodatkowymproblememjakiczasamipowo-<br />

dowałbardzodużykrokpodziałkibyłynienaturalneścieżki.Przydużejpodziałcealgorytm<br />

mógłpominąćbardziejnaturalnądrogędocelu.Pókiniedotyczyłotopostacigraczanie<br />

byłotoproblemem,aużywaniewmiaręmożliwościdużychpodziałekznacznieprzyśpieszało<br />

wyszukiwanieścieżek.<br />

3.6.4.Automatycznypodziałpłaszczyzny<br />

Czaszająćsięwyszukiwaniemścieżkinawiększeodległości.Dlawieluprojektównajlepszym<br />

rozwiązaniem,będzieautomatycznypodziałświatagrynarejony,pomiędzyktórymiprzeli-<br />

czanesą(leniwiebądźprzywczytywaniu)połączenia.Szukającdroginajpierwsprawdzamy<br />

przezjakierejonykolejnoprzejdziemy,adopieropóźniejwyszukujemykonkretneścieżkina<br />

przejściewichobrębie.Takiepodejścienadajesiędostosowaniaszczególniewgrach,wktó-<br />

rychświatgryjestbardzodynamiczny(zmieniasięwtrakciedziałaniagry)lubgeometria<br />

świata,bądźmodelporuszaniasąproste.Plusemtegorozwiązaniajestto,żeniewymaga<br />

13 Leniweobliczanietotechnikaprogramistycznaodwlekaniaobliczeńdoczasu,ażichwynikbędziepotrzeb-<br />

ny.Dokorzyściwynikającychzleniwegoobliczanianależyzaliczyć:zwiększeniewydajności,dziękiuniknięciu<br />

niepotrzebnychobliczeńimożliwośćtworzenianieskończonychstrukturdanych.<br />

48


żadnejpracyzestronyinnychosóbpozaprogramistą.Utrudniaonojednakmożliwościzewnętrznejkonfiguracjisystemuorazjegosilnąintegracjęzsystememsztucznejinteligencji.Wpraktycejesttodobrerozwiązaniewprojektach,wktórychzzałożenianasystemiewyszukiwaniaścieżekniespoczywawiększaodpowiedzialność.Jeżelinienakładamyograniczeńna<br />

geometrieświata,rozwiązanietomożebyćbardzoproblematyczne.Możnasobiewyobrazić<br />

wielesytuacji,którychautomatycznypodziałświataniebędziemógłobsłużyćbezdodatkowych,skomplikowanychmechanizmów.Dużotrudniejteżjestzachowaćrealizmiintuicyjność<br />

ścieżek.Trzebateżpamiętać,żepodziałpłaszczyznymakluczoweznaczeniedlawydajności<br />

wyszukiwaniaścieżeknaniższympoziomie-aprzyprzypadkowympodzialeniemamynato<br />

wpływu.<br />

WsilnikugryNeverwinterNights 14 użytebyłowłaśnietopodejście.Wyszukiwanieścieżek<br />

odbywałosięnatrzechpoziomach.Najpierwpomiędzy”lokacjami”(ang.Area)gry,odpowiadającymijednemuspójnemuetapowi.Dlagraczaprzejściepomiędzy”lokacjami”wymagałoprzeładowania,stanowiływięconedużeobiekty.Nadrugimpoziomiewyszukiwanieprzechodziłoprzez”kafelki”(ang.Tile),będącekwadratowymiobszaramiozadanejwielkości,na<br />

którepodzielonabyłalokacja.Następnienanajniższympoziomieścieżkaliczonabyłajuż<br />

pomiędzykonkretnymi”kafelkami”.<br />

3.6.5.Pokoje<br />

Zamiastautomatycznegopodziałupłaszczyznymożemyzastosowaćpodziałręcznyna”pokoje”.Pociągatozasobąkoniecznośćstworzenianarzędziadoichustawianiaorazręcznegoichwyznaczeniawlokacjachgry.Znającmechanizmdziałaniasystemuwyszukiwaniaścieżekuzyskujemywpływnapoprawnywybórprzezpostaciewyszukiwanejdrogi.Wwyniku<br />

tegorozwiązaniamożemyuzyskaćznacząceprzyśpieszeniewyszukiwaniaścieżek 15 aścieżki<br />

wyliczonebędądużologiczniejszeilepiejdopasowanedogeometriiispecyfikilokacji.Ztym<br />

podejściemsązwiązanejednakpewneproblemy.Popierwszewymagaonenakładupracyproporcjonalniedużego,wporównaniudopozostałych,prezentowanychprzezemnierozwiązań.<br />

Podrugiejestnieintuicyjneiwyrobieniezasadpodziałunapokojewymaganauki.Potrzecie<br />

-zmianawsystemiewyszukiwaniaścieżekmożewymusićzmianęustawieniapokoilokacjiw<br />

grze...Wszystkich.<br />

TorozwiązaniezostałoużytewWiedźminie.Niestetyprzyniosłosporoproblemów.Podstawoweznichleżąniepostroniesamegoalgorytmicznegorozwiązania,leczprocesupracy<br />

nadlokacjągry.Systemwyszukiwaniaścieżekjestkonfigurowanypoprzezpodziałprzestrzeni<br />

poruszanianapokoje.Jestonrobionywprogramie3DStudioMaxprzezgrafika.Natymetapiepracmamylokacjęgry,aleniejesteśmywstaniepowiedziećjakrozmieszczonebędąwniejobiektyiprzeszkody.Byporadzićsobiezestatycznymiprzeszkodamiumieszczanymiwlokacji,trzebabyłonapisaćskomplikowanysystemsprawdzającyspójnośćpokoiorazpołączeń<br />

pomiędzynimi,awszczególnychprzypadkach,gdycałelokacjegrypokrytebyłybarykadami,<br />

specjalnieustawiać”naoko”krawędziepokojówbydopasowaćjedoprzeszkód.Projektanci<br />

implementującyfabułęniemielidostępudokonfiguracjisystemuścieżek,wpraktycewięc<br />

nierozumieligo,nieznalijegosłabościiniewykorzystywalijegomożliwości.Toniejedyne<br />

14 JednazpierwszychkomputerowychgierRPG(roleplayinggame)prezentowanazperspektywytrzeciej<br />

osoby,wpełnitrójwymiarowymświecie.NapisanaprzezBiowareInteractiveiwydanawpołowie2002roku<br />

przezInfogames(dzisiajwystępującejakoAtari).SilnikAurora,naktórymbyłaoparta,byłpodstawądo<br />

stworzeniapolskiego”Wiedźmina”.<br />

15 Wiemy,pomiędzyktórymipunktamibędziewyszukiwanaścieżka.Możemyzapewnić,żewwiększości<br />

przypadkówwierzchołki,pomiędzyktórymiścieżkaprzezdanepokojebędziewyszukiwanabędąpołączone<br />

prostąlinią.Tozkoleimożekończyćpracęalgorytmuwpierwszymkroku,bezpotrzebyodpalaniaalgorytmu<br />

A*.<br />

49


problemyjakiesprawiałtenpodział.WpraktycewWiedźminiesystemwyszukiwaniadziała<br />

myślęprzyzwoicie,jednakzostałotoosiągniętezupełnienieproporcjonalnymnakłademsił.<br />

Poniżejomawiamrozwiązanieopierającesięnazastosowaniupunktównawigacyjnych.Choć<br />

algorytmiczniesprowadzasiędoomawianego,tozpunktuwidzeniaprocesupracynadgrą<br />

jestmyślędużolepsze.<br />

Przykładużyciapodziałunapokojeorazsiatkinawigacyjnejmożnazaobserwowaćna<br />

ilustracji 3.8.<br />

Rysunek3.8:ŚwiatWiedźminaijegosiatkanawigacyjnazzaznaczonymkolorempodziałem<br />

napokoje<br />

3.6.6.Grafwidoczności<br />

Najskuteczniejszymrozwiązaniem,októrymsłyszałem,automatycznietworzącymreprezentacjęświatawsystemiewyszukiwaniaścieżek,jestgrafwidoczności.Zastosowanieopartegootąstrukturęalgorytmuzapewniabardzoefektywnewyszukiwanieścieżkizarównonamałejakidużeodległości,choćwymagadokonaniapewnejprekalkulacjilokacjiświatagrywktórejtoczyćsiębędzierozgrywka.Jesttodoskonałerozwiązaniedlaskomplikowanejgeometrii.Choćniemiałemznimbezpośredniejstyczności,sprawiaonowrażanietrudnegow<br />

implementacjialeniewymagadodatkowejpracyodresztyzespołuprojektowego.<br />

Spójnączęśćświatagrymożemyabstrakcyjniereprezentowaćjakowielokątdowolnego<br />

kształtuposiadającywsobiepusteobszary,którychbrzegirównieżstanowiąwielokątyo<br />

dowolnymkształcie.Wówczaswęzłamigrafuwidocznościmogąbyćwierzchołkileżącena<br />

krawędziwielokątaświataipustychobszarówwjegownętrzu.Dwawierzchołkitegografusą<br />

połączone,jeżeliistniejepomiędzynimiprostalinianieprzechodzącaprzezwnętrzepustego<br />

obszaruinieprzecinającakrawędziświata.Mającutworzonytakigrafjesteśmywstaniew<br />

bardzoszybkimczasieznaleźćnajkrótsząłamanąłączącądwadowolnepunktyświata.OpierającsięnawiedzyzwykładuGeometriaObliczeniowaprowadzonegonanaszymwydziale<br />

przezdoktoraMirosławaKowaluka,wiemżegrafwidzialnościjesteśmywstaniestworzyć<br />

wpesymistycznymczasieO(n 2 ),gdzienjestliczbąkrawędziświata.Jesttojednocześnie<br />

pesymistycznymrozmiarstruktury.WyszukiwaniewnimdrogipomiędzydwomapunktamiodbywasięwpesymistycznymczasieO(nlog(n)+m),gdziemtoliczbakrawędzigrafu<br />

widoczności.Wpraktyceprzyodpowiednimdostosowaniualgorytmudospecyfikiprojektu<br />

możemyotrzymaćbardzouproszczonąreprezentacjęprzeszukiwanejprzestrzeni.<br />

50


Wierzchołkigrafuwidocznościmożnawyznaczyćautomatyczniewinnysposób,umieszczającjewyłącznieprzybrzegachspójnychobszarówświata.Tominimalizujeprzestrzeńwyszukiwania.PodstawowewprowadzeniedozastosowaniagrafuwidocznościwsystemiewyszukiwaniaścieżekznalazłemwrozdzialenapisanymprzezSteveaRobinawpierwszymtomie<br />

PerełekProgramowaniaGier[DLo1].<br />

Zzastosowaniemtejmetodywiążąsięjednakpewnetrudności.<br />

•Reprezentacjadynamicznychprzeszkód–czylipostaci(cozwykleitaksprowadzasiędoodrębnegoproblemu)iruchomejgeometriiorazobiektówstatycznych.By<br />

reprezentowaćdynamiczneobiektywtymsystemiewyszukiwaniamożemywtrakcie<br />

działaniatworzyćichreprezentacjęwgrafiewyszukiwaniaścieżekimodyfikowaćgraf<br />

wzależnościodniej.Ewentualnie,jeżelijesteśmywstanieokreślićwszystkiemożliwe<br />

stanytychobiektów(np.drzwimogąbyćotwartelubzamknięte),alboprzynajmniejje<br />

sparametryzować,możnaużyćparametrycznejreprezentacjipołączeńgrafu,którebędą<br />

aktywnewzależnościodstanudynamicznejprzeszkody.<br />

•Rozmiarobiektów–połączeniasątestowanaprzezprowadzenieprostejliniipomiędzy<br />

punktami.Uwzględnienierozmiaruobiektówwwyszukiwaniujestprzytympodejściu<br />

nietrywialne.<br />

•Zależnośćodgeometrii–czasami,jeżeliniezastosujemydodatkowych,heurystycznychoptymalizacjiiuproszczeńgeometriinawigacyjnej,rozmiargrafumożezupełnie<br />

niepotrzebnieurosnąć.Wyobraźmysobiekwadratowypokój,naśrodkuktóregojest<br />

bardzodokładniewymodelowanaokrągłakolumna-wrzeczywistościbędącan-kątem<br />

foremnym,dlawysokiegon.Liczbawypukłychobszarówwtymświeciebędzierówna<br />

liczbiewierzchołkówkolumny.Wrazzichliczbąbędzierosławielkośćgrafuwidoczności.<br />

Rozszerzonageometria<br />

Wgrafiewidocznościpołączeniamamywyznaczonewformieliniiprostych,conieuwzględnia<br />

kształtuirozmiaruobiektów.Przybliżmykształtobszarukolizjiobiektupewnąfigurągeometryczną.NazwijmyrozszerzonągeometriąsumęMinkowskiego<br />

16 geometriiświataikształtuprzybliżającego.Grafwidocznościrozszerzonejgeometriiświatareprezentujemożliwość<br />

przemieszczaniakształtuprzybliżającego.Niebierzemytupoduwagęobrotów,należywięc<br />

przybliżyćobiektgrymożliwieprostą,symetrycznąfigurą.Najczęściejmożemysobiepozwolićbyobiektygryreprezentowaćwdwuwymiarowejprzestrzeniwyszukiwaniaścieżekjakokoło.Jakonaszkształtbudującyrozszerzonągeometrięnajlepiejnadawaćsiębędzieopisanynaokręgukolizjikwadrat,ewentualnieośmiokątforemny,aleliczbawierzchołkówgrafuwidocznościjestliniowozależnaodliczbykrawędzikształtuprzybliżającego.Stosującrozszerzonągeometriędostajemygrafwidoczności,którydobrzeopisujeprzestrzeńwyszukiwania<br />

obiektuozadanymrozmiarze.Możemyzastosowaćparametrycznąreprezentacjęrozszerzonej<br />

geometriibywygenerowaćprzestrzeńwyszukiwaniaścieżekdlaróżnegorozmiaruobiektów.<br />

16 DefinicjaSumyMinkowskiego.RozpatrzmywielokątyAiBjakozbiorywektorówowspółrzędnychodpowiadającychwspółrzędnympunktównależącychdotychwielokątów.WtedySumęMinkowskiegomożemy<br />

określićnastępująco.<br />

A+B={x+y:x∈A∧y∈B}<br />

51


Uproszczonygrafwyszukiwania<br />

Metodatworzeniagrafuwyszukiwania,opisananapoczątkumożezostaćznaczącozoptymalizowana,podkątemminimalizacjigrafu.Interesujenasgrafpunktówprzestrzenitaki,żez<br />

każdegomiejscawświeciewidzimyconajmniejjedenztychpunktówaobszarypunktów,<br />

któremożemyprzypisaćdodanegowierzchołkasąspójne.Wbrewpozoromproblemtennie<br />

jestproblememgaleriisztuki 17 ,choćprawdopodobniezrozwiązańtegoproblemumożnawyciągnąćwielewnioskówdotyczącychoptymalizacjigrafuwidocznościwgrzekomputerowej.<br />

Implementującgrafwidocznościistotąoptymalizacjibędzieminimalizacjawierzchołkóworaz<br />

krawędzigrafu.Trzebamiećnawzględzie,żepraktycznezastosowanietegoalgorytmubędzie<br />

wiązałosięzkoniecznościąwprowadzeniawielumechanizmówoptymalizacyjnych.<br />

Wrozważaniachnatematgrafuwyszukiwaniaopierałemsięnarozdziałachautorstwa<br />

ThomasaYoungaPerełekProgramowaniaGier[DLo2].ZnalazłemtamszczegółowoprzedstawionemetodyoptymalizacjigrafuwidocznościorazopisalgorytmówzwiązanychzzastosowaniemrozszerzonejgeometriiitworzeniusumyMinkowskiego.<br />

3.6.7.Punktynawigacyjne<br />

Punktynawigacyjnemożemyuznaćzarównoważnegrafowiwidoczności,wktórymręcznie<br />

wstawiamywierzchołkigrafu.Sąonejednocześniebardzozbliżonedorozwiązaniaopartego<br />

o”pokoje”.Wlokacjigryzostająręcznierozstawionepunktynawigacyjne.Mogąonebyć<br />

obiektamigry,reagującyminazdarzeniaikontrolowanymiprzezogólnemechanizmygry<br />

oraznaprzykładpoleceniajęzykaskryptowegoobsługiwanegoprzezgrę.Punktynawigacyjne<br />

tworzągraf,poktórymwyszukiwanesąścieżki.Pomiędzydwomawierzchołkamigrafuistnieje<br />

połączenie,jeżelipomiędzyreprezentującymijepunktaminawigacyjnymiistniejeprzejściew<br />

liniiprostej.Wpraktycewstawiającpunktynawigacyjnewedytorzemożemyzobaczyćjak<br />

wpływająonenasystemwyszukiwaniaścieżek.Każdyztychpunktówmożemyopisaćzbiorem<br />

parametrówpozwalającymnamkontrolowaćichdziałanie.<br />

•Ktomoże,aktonieużywaćtegopunktuwwyszukiwaniuścieżek.<br />

•Możemyprostoobserwowaćlub”ręcznie”modyfikowaćwartościowaniewęzłówgrafu<br />

wyszukiwaniaścieżek.<br />

•Mamypełnąkontrolęnad”aktywnością”punktunawigacyjnegowsystemiewyszukiwaniaścieżek.<br />

•SilnaintegracjazsystememAI.Możemyzdefiniowaćwartośćstrategicznądanegopunktu.Możebyćonarównieżheurystyczniewyliczona.Punktynawigacyjnemogąokreślać<br />

miejsca,wktórychwartowypatrywaćprzeciwnika,przygotowywaćzasadzkę,kryćsię<br />

czydoktórychniemożnadopuścićinnychpostaci.<br />

•Punktnawigacyjnymożebyćpowiązanyzobiektamigryktórychstanmożedecydować<br />

ojegoaktywności.<br />

•Możemyzłatwościątworzyćróżne,specjalnerodzajeprzejśćjaknp.drogiookreślonej<br />

szerokości(poktórychprowadziścieżka,nawetjeśliwygładzaniepozwoliłobyjąskrócić),<br />

drogijednostronne(pisałemjużwyżejokorzyściachwutrzymaniuprawostronnego<br />

ruchunadrodze),przejściawymagająceużyciaobiektówotoczenia(winda).<br />

17 GaleriasztukitoznanyNP-trudnyproblemgeometriiobliczeniowej.Celemjestznalezienieminimalnego<br />

zbioruobserwatorówpotrzebnychbypokryć”wzrokiem”całąpowierzchnięwirtualnejgaleriisztuki.<br />

52


Wpraktycerozwiązanieto,przydobrejimplementacji,sprowadzasięwdziałaniudosystemu<br />

pokoi.Potrzebujewiększegowsparciaodstronynarzędziiparudodatkowychelementóww<br />

implementacji.Jestzatodużowszechstronniejsze,skalowalne,bardziejintuicyjne,prostsze<br />

wedycjiiwymagająceodresztyzespołumniejszegonakładupracy.Jednocześniejesttowykorzystaniegrafupokoistworzonegoprzezprojektantów.Byćmożejesttowspaniałaszansa<br />

dlastworzeniahybrydowegosystemuwyszukiwaniaścieżek.Możemykorzystaćzalgorytmów<br />

automatycznych,gdyniemamyopisanejprzestrzenilubtworzyćautomatyczniekonfiguracje<br />

systemu,któranastępniemogłabybyćręczniemodyfikowana.<br />

3.6.8.Dodatkoweelementysystemuwyszukiwaniaścieżek<br />

Chciałemjeszczewspomniećodwóchelementachsystemuwyszukiwaniaścieżek.Niemająone<br />

większegowpływunaarchitekturęsystemujakocałości,alesąpodstawowymimechanizmami,<br />

którychimplementacjamabardzodużywpływnagrę.<br />

Wygładzanie<br />

Wygładzanieścieżekjestbardzoistotnąkwestią.Dobrzenapisaneściągawieleodpowiedzialnościzpodstawowegosystemuwyszukiwania.WwynikuwyszukiwaniaA*dostajemyzwykle<br />

listępunktów,którełącząsięwścieżkępełnąkątówprostych,nagłychzwrotów,częstomałych<br />

nielogiczności.Wygładzaniedziałanatychpunktachzapewniającdwiepodstawowerzeczy.<br />

Nailetomożliwezmniejszaliczbęwęzłów,łączącte,pomiędzyktórymimożemyprzeprowadzićprostą.Drugimzadaniemwygładzaniajestdopilnowaniebywmiaręmożliwościnaścieżceniebyłoostrych,nienaturalnychzwrotów-tozkoleiwymagazwykledodaniadodatkowychwierzchołków.<br />

ImplementacjawygładzaniawWiedźminiewyglądanastępująco.Najpierwnaścieżce<br />

wstawianesąwrównychodstępachdodatkowewierzchołki-byumożliwićskrócenieścieżki.<br />

Następniealgorytmprzechodzipowierzchołkachścieżki.Dlabadanegowierzchołkawybiera<br />

następnik,ułożonymożliwienajdalejnaścieżce,adoktóregomożnadojśćzniegowprostej<br />

linii.Wszystkiewierzchołkipomiędzybadanymajegonastępnikiemsąodrzucane,aalgorytm<br />

wykonujesięponowniedlanastępnika,ażdotrzedokońcaścieżki.Potem,jestdokonywane<br />

wygładzanieostrychkrawędzipoprzezdodawaniedodatkowychwierzchołkóworazprzesuwanieistniejących.Niejestemautoremtegomechanizmu.Osobiściedosystemuwygładzania<br />

dodałemtylkododatkowymechanizmłączącydwiegładkieścieżki.Potrzebnybyłon,gdy<br />

dołączanodoaktualniewyliczonejścieżki,kolejnyjejfragment,przechodzącyprzeznastępny<br />

pokój.<br />

Kosztczasowywygładzaniajestwłaściwiepomijalnywstosunkudoczasuodnalezienia<br />

ścieżki.Efektjestjednakbardzodobry.Ścieżkisąnaturalnieproste,pozbawioneostrych<br />

zwrotów,ajednocześnieoptymalniebliskoprzechodzągładkimłukiemprzyprzeszkodach.<br />

Efektużyciawyszukiwaniaijegowpływnawyliczoneścieżkiprzedstawiamnailustracji 3.9.<br />

Omijanieobiektów<br />

Ponieważśrodowiskogryjestdynamiczne,jestdużaszansa,żewyliczonaprzeznasścieżka<br />

zostaniezablokowanaprzezinnyporuszającysięobiekt.Rozwiązanietegoproblemujest<br />

bardzoistotneiczęstonietrywialne.Dlagraczabardzoirytującemożebyć,gdyniebędzie<br />

mógłprzedostaćsięprzeztłumszarychprzechodniów,przypadkowapostaćzablokujemu<br />

wąskieprzejścielubzobaczydwóchniemogącychsięwyminąćprzechodniów.<br />

53


Rysunek3.9:Wpływwygładzanianaścieżkę<br />

Powyższyproblemmożnarozwiązaćnawieleróżnychsposobówiwpraktyce,najlepszejestwłaśnierównoległewykorzystaniewieluznich,coniepowodujeugraczawrażenia<br />

powtarzalnościipozwalaobsłużyćbardzociężkiedorozwiązaniasytuacje.<br />

•A*—Jednymzpodstawowychrozwiązańjestwyszukanieścieżkiobchodzącejprzeszkodę.Wynajdujemybezpiecznąpozycjęnanaszejdrodze,wktórejniekolidujemyzżadnądynamicznąprzeszkodą,anastępniewłączamywyszukiwanieA*.ZależnieodtegojakustawimywyszukiwanieA*,metodatamożewiązaćsięzpewnymiproblemami.<br />

Popierwszewyszukiwaniepotencjalniemożebyćdosyćdrogie,ajednocześniepowinno<br />

byćliczonewjednejramcegry.Zdrugiejstrony,jeśliograniczymyjedojednejramkii<br />

przeznaczymynanieograniczonyczas,bądźliczbęwierzchołków,jegozasięgiużytecznośćmogęucierpieć.Kolejnympotencjalnymproblememjestwielkośćpodziałki.Przy<br />

mniejszejpodziałceniemaproblemuzzauważaniemwęższejdrogi,natomiastwiększa<br />

podziałkaznaczącozwiększazasięgprzeszukiwania.<br />

•Przewidywaniekolizji—Nakolizjepowinniśmyreagowaćzanimsiępojawią.Istniejąbardziejskomplikowanealgorytmy,alewWiedźminiezastosowaliśmyprostyidosyć<br />

skutecznymechanizm.Idącapostaćtestowała,czynajejścieżce,bezpośrednioprzed<br />

nią,nieznajdująsięinnepostacie.Jeślitak,włączaławyszukiwanieA*byominąć<br />

je.Wyszukiwaniebyłoograniczoneczasem,alebyłopowtarzanewkolejnychramkach.<br />

Oczywiścietakiepodejścieniezałatwiwielusytuacji,gdyktośnaprzykładnaglewbiegnienamnadrogę,alewpraktycesprawdzałosiędostateczniedobrzeiwpołączeniuz<br />

innymimechanizmamiomijaniadawałokomfortporuszania.<br />

•Przewidywanieruchu—Problememobupowyższychrozwiązańjestfakt,żedziałały<br />

54


dlastatycznegośrodowiska.Wyszukującścieżkę,któraokrążałaporuszającąsiępostać<br />

bardzoczęstomogłosięzdarzyć,żejużpochwiliznowuzniąkolidowaliśmy.Ważnąrze-<br />

cząjestwięcbyzdawaćsobiesprawęzruchuobiektówprzyliczeniudrogijeomijającej.<br />

Istniejązaawansowanetechnikiuwzględniająceprzyliczeniuścieżkiomijającejwartość<br />

czasuipozycjęobiektówwdanejjednostceczasu,jednakniemiałemznimiwiększej<br />

stycznościiniebyłemwstaniezgromadzićwiarygodnychmateriałównaichtemat.<br />

Bardzoprostymrozwiązaniem,adającymwymierniedobrerezultaty,jestwyłączenie<br />

zwyszukiwaniaA*krótkiegowycinkaścieżkiomijanychobiektów.Jegodługośćmoże<br />

byćzdefiniowanaodgórnie,zależnaododległościodgracza,bądźprędkościporuszania<br />

sięobiektu.Rezultatjestzauważalnyiprzyzwoity,akosztdziałaniatejmetodywgrze<br />

orazczasjejimplementacjisąnieznaczne.<br />

•Algorytmystada—Dobrympodejściemjestwykorzystaniedoomijaniarozwiązań<br />

podobnychjakteużytewalgorytmiestada. 18 Gdyobiektyporuszająsiędostatecznie<br />

bliskosiebie,naichruchzaczynaoddziaływaćsiłaodpychającajeodinnych,zależna<br />

odichbliskości.Wefekciewbardzonaturalnyiintuicyjnysposóbgrupypostacimogą<br />

niejakowymijaćsięwzajemnienawetwrozległymtłumie.<br />

•IntegracjazgrąiAI—Pamiętajmy,żejeżeliodpowiedniowizualnieimechanicz-<br />

nietozamodelujemy,możespowodować,żepostaciebędąsięwzajemnieprzepuszczać,<br />

przepychaćczyczekaćparęchwilażdrogabędziewolna.Możemypokusićsięointegra-<br />

cjęomijaniazsystememAIitworzenierozwiązań,wktórychpostaciebędąwzajemnie<br />

nasiebiereagować.Jeżelidobrzezamodelujemytakierozwiązania,mogąonetchnąć<br />

dużożyciawświatgry,spowodować,żebędziewyglądałbardziejnaturalnie.Tuzno-<br />

wuposłużęsięprzykłademWiedźmina.Jednymzgorszychmechanizmówomijania,<br />

stosowanymwprzypadkach,gdyniemogliśmywykorzystaćinnych,byłoprzepycha-<br />

niepostaci.Postać,którastałanadrodzeinnej,wyszukiwałasobiebezpiecznemiejsce<br />

obokścieżkiiporuszałasiędoniego.Drugapostaćpoparuchwilachkontynuowała<br />

ruch.Wyglądałotonienaturalnie,dlategorozwiązanietobyłowykorzystywanebardzo<br />

rzadko,gdyinnesposobyrozwiązaniaproblemuzawiodły.Wystarczałojednaktroszkę<br />

mocniejzintegrowaćtenmechanizmzgrą.Zostałondelikatniezmodyfikowany.Postać<br />

odpychającamiaławłączanąanimacjęręki,którąprzesuwaładrugąosobę.Tazkolei<br />

równieżwykonywałaspecjalnąanimację”byciaodepchniętą”.Dotegododałemmałe<br />

smaczkitakiejakprostodefiniowanyparametr”godności”,świadczącyotymktokogoi<br />

wjakichsytuacjachmożewtensposóbodepchnąć.Implementacjategobyłanaprawdę<br />

szybkaiprosta.Poprawiłotoomijanie,ponieważbyłtomocnymechanizmwyglądający<br />

natyleładnie,żestarałemsięrozsądnieczęstowykorzystywaćtenefekt.Wdodatku<br />

pozwoliłotonadodaniewieluprostych,aładnychsmaczkówdogry,takichjaknaprzy-<br />

kładpostacieowysokimpriorytecie,dlaprzykładubogacimieszczanieczyrycerstwo,<br />

niewymijającepospólstwaibiedoty,tylkobrutalnierozpychającywchodzącychimw<br />

drogę.<br />

•Oszustwa—Gratonieaplikacjabankowaituczasamiprogramistamożetroszkęoszu-<br />

kać.Wartoztegokorzystaćzpewnymumiarem.Jeżeligraczeniewidząbezpośrednio<br />

zdarzenia,omijaniemożemysprowadzićdoczystejteleportacji.Wartootympamiętać,<br />

bomożenamtowyraźniewpłynąćnawydajnośćcałegomechanizmu.Kolejnąokazją<br />

dooszustwsąsytuacje,wktórychpostacie,zgodniezmechanikągrypoprostuniesą<br />

wstaniesięwyminąć.Wartowtedypomyśleć,czyczasaminiewartonagiąćwówczas<br />

18 Algorytmstada(ang.flock)-dokładneinformacjeonimznajdująsięwrodziale3.7.<br />

55


zasadygryinaprzykładpozwolićpostaciomnawzajemneprzenikanie.Takierozwiązaniapowinnybyćstosowanewyłączniewostateczności,gdywszystkieinnezawiodą.<br />

Jeżeliniebędziemymoglipoświęcićwiększegoczasunastworzenierozwiązaniatakiej<br />

sytuacji,opartegoosystemsztucznejinteligencjialbospecjalnezachowaniepostaci,<br />

wówczaswartorozważyćwprowadzeniemałegooszustwa.<br />

•Niedeterminizm—Dobrąpraktykąprzywszystkichpowyższychpodejściachjest<br />

zastosowaniepewnegoniedeterminizmu.Szczególnietyczysiętorozwiązańopartych<br />

ozachowania,sztucznąinteligencjęianimacje.Jeżeligraczprzyzwyczaisiędotego,<br />

żepewnesytuacjesązawszejednakoworozwiązywane,możetoprowadzićdołatwego<br />

spowszednieniatychmechanizmówiwkonsekwencjiosłabićefekt,którywywrąone<br />

nagraczu.Jeżelizasadydoborumetodyomijaniabędąbardzopłynne,intuicyjneale<br />

ciężkiedopełnegowyśledzenia,bądźpoprostuzależećbędąwograniczonysposóbod<br />

przypadku,możetowpłynąćpozytywnienaodbiórprzezgraczazachowaniasiępostaci<br />

wgrze.<br />

Rysunek3.10:Omijanie.Poprawej:przykładużyciaprzewidywaniakolizji(niebieskielinie).<br />

Polewej:ciężkasytuacjarozwiązanaprzezinterakcjeobiektów(przepychanie).<br />

3.6.9.Wnioski<br />

Najlepszewyszukiwanieścieżek,totakiektóregokońcowyużytkownikniezauważy.Totakie<br />

też,któreniebędziezauważalnewkontekścierozważaniawydajnościaplikacjiorazktórezafundujenajmniejsząilośćpracyzespołowipracującemunadgrą.Systemmusibyćzaprojektowanywodniesieniudogry,funkcjonalnościjakąodniegooczekujemyorazodpowiedzialnościjakąnaniegochcielibyśmyzłożyć.Bardzoczęstomodułwyszukiwaniaścieżekstanowiintegralnączęśćsystemusztucznejinteligencji.Jużwtrakcieprojektowanianależyprzewidzieć<br />

jakwpłynieonnacyklpracynadlokacjamiifabułągry.Zaprezentowałemkilkaznanych<br />

rozwiązań.Doproblemuwyszukiwaniaścieżekmożnapodejśćjednakjeszczenawieleinnych<br />

sposobów.Szczególniedelikatniepotraktowałemsystemyautomatycznegopodziałuprzestrzeni,jakożewtejkwestiimammniejszedoświadczenieorazwichprzypadku,implementacja<br />

56


modułusprowadzasiędorozwiązaniaalgorytmicznego.Zestawiajączesobązaprezentowane<br />

rozwiązania,chciałemuczulićczytelnikanaaspekty,którewymagająuwagijużnaetapie<br />

projektowaniasystemu.<br />

57


3.7. Algorytmstadaisztucznainteligencja<br />

Algorytmstadazostałzaprezentowanyw1987rokuprzezCraigaReynoldsawreferacie<br />

”Flocks,Herds,andSchools:ADistributedBehaviorModel” 19 .Przedstawiałonmodelreprezentacjiobiektówsymulacji.Wjegopodejściuobiektybyłyautonomicznymiagentami,znającychwyłącznieswojedynamiczne,lokalneotoczenie.Agenciprzestrzegająckilkupodstawowych,intuicyjnychzasadwykazywalizbiorowezachowaniasymulującestadaptaków,<br />

owadów,czyławicęryb.Tezasadyto:<br />

•Separacja—zapobieganiezbytniejbliskościobiektówznaszegootoczenia.<br />

•Wyrównanie—obiektdopasowujesiędośredniegokierunkuitempaporuszania<br />

obiektówlokalnejgrupy.<br />

•Spójność—obiektjeststerowanywkierunkucentrumlokalnejgrupy.<br />

•Unikanie—dodanapóźniejzasada.Agentstarasięunikaćprzeszkódorazinnych,<br />

szczególniewrogich,obiektów.<br />

Agenciwchodząwinterakcjęwyłączniezobiektamiznajdującymisięwichbezpośrednim<br />

otoczeniu.Niekomunikująsię,nieplanują,nieprzechowujądodatkowychinformacjiostadzie<br />

czyśrodowiskuwktórymsięznajdują.Ichdziałanieopartejestwyłącznieopercepcję.<br />

DozasadnaktórychoparłsięCraigReynoldsmożnadodaćoczywiściewłasne.Przypisując<br />

impriorytetywbardzointuicyjnysposóbmożemymodelowaćzachowanieobiektów.<br />

Rysunek3.11:IlustracjeCraigaReynoldsadotyczącekolejnoseparacji,wyrównaniaispójności.<br />

3.7.1.Implementacja<br />

Dlauproszczeniaprzyjmijmy,żenaszobiektznajdujesięwtrójwymiarowejprzestrzeni.W<br />

danejjednostceczasujestskierowanywpewnymkonkretnymkierunkuorazposiadaskierowanywtąstronęaktualnywektorruchu.<br />

Algorytmwkażdymkrokumodyfikujewektorruchu,poprzezdodaniedoniegowektora<br />

modyfikacji.Wektormodyfikacjitworzymysumującwektorypotrzeb,którychdługośćjest<br />

mnożonaproporcjonalniedopriorytetupotrzeby(specyficznegodladanegoobiektu).Wektory<br />

potrzebzkoleisąimplementacjąstosowanychzasadstadnych(np.separacji,wyrównaniai<br />

spójności).<br />

Nawejściedlaalgorytmubędziemymusielizdefiniowaćmechanizmwidoczności.Obiekt<br />

musiwidziećznajdującesięwkołoobiektygry.Powinienmócokreślićnajbliższyznichoraz<br />

uśrednionepołożeniewidzianychprzezniegoczłonkówstada.<br />

Potrzebęseparacjimożemyzaimplementowaćsprawdzającodległośćmiędzyrozpatrywanymobiekteminajbliższym,widzianymczłonkiemstada.Jeżeliodległośćtajestmniejszaod<br />

pewnejzałożonej,tworzymywektorpotrzebyseparacji.Skierowanyonbędzieodwidzianego<br />

19 Dostępnypodadresemhttp://www.red3d.com/cwr/papers/1987/boids.html<br />

58


obiektudoobiekturozpatrywanegoijegodługośćjestzależnaodwspółczynnikabliskości<br />

obiektów(czymbliżejtymmocniejszeoddziaływanieodpychające).Jednocześniemożemy<br />

teżprzyciągaćobiektdonajbliższego,jeżeliodległośćjestwiększaodpewnejzałożonej,choć<br />

przynajmniejjaniewidziałemdlategooddziaływaniadobregozastosowania.<br />

Wektorpotrzebywyrównaniamożemyzkoleiutworzyć,biorącpoprostuznormalizowany<br />

wektorruchunajbliższegoobiektu.<br />

Wektorspójnościmożebyćreprezentowanyjakoznormalizowanywektorskierowanyod<br />

rozpatrywanegoobiektu,dośrodkastada.<br />

Unikanieobiektówmożemyzaimplementowaćnawzórfizycznejsiłyodpychania,kwadratowoprzybierającejnasilewrazzezmniejszaniemsięodległości.Wszystkiepowyższewektorymnożymyprzezpriorytetypotrzebjakiereprezentują.Następniesumujemyje,aotrzymanywektormożemypoddaćdodatkowymprzekształceniomnaprzykładograniczyćjegomaksymalnądługość.Następniewektorzostajeużytywsterowaniuiwpływanazmianęaktualnegowektoraruchuobiektu.<br />

3.7.2.Wydajność<br />

Podstawowaimplementacjaalgorytmuwymagabykażdyczłonekstadawykonałconajmniej<br />

liniowąliczbęczynnościzwiązanychzjegoobsługą.Głównymproblememjesttuzapewnieniewidoczności.Ponieważczęstoalgorytmstadajeststosowanydoimplementacjiprostych<br />

obiektów,będącychraczejtłemgryiniewpływającychnapodstawowąmechanikęrozgrywki,<br />

szkodaczasempoświęcaćmuzbytwielezasobówgry.Podstawowąoptymalizacjąjestuproszczeniemechanizmówwidoczności.Możemystworzyćprzedefiniowanestada,wktórychobiektywidząsiębezpotrzebywykonywaniadodatkowychtestów.Możetobardzoprzyśpieszyćalgorytm,ponieważrównieżtestywidocznościzinnymiobiektamistadomożewykonywaćjakocałość.Niestetytakiestadastracąswojąpodstawowąfunkcjonalność,jakąjestautonomicznośćagentów.Przestanąsięonełączyć,dzielić,oddziaływaćwzajemnienasiebie,acałość<br />

stracinawiarygodności.Kolejnąmożliwościąjestuproszczeniemechanizmówwidoczności.<br />

Podzielmynaprzykładświatnakratkiipowiedzmy,żewszystkieobiektystadnewdanej<br />

kratcesięwidzą.Torównieżprosteiskutecznerozwiązanie,sprawiającejednak,żeobiekty<br />

stadneczasamibędąwobecsiebieślepe,cołatwodostrzeżeuważnyobserwator.Gdywięc<br />

rozpoczynamyimplementacjęalgorytmuwartodostosowaćjądozadańjakiemupowierzamy<br />

iichpriorytetuwprojekcie.<br />

3.7.3.Modyfikacjealgorytmu<br />

NastronietwórcyalgorytmuCraigaReynoldsa 20 [CR]znajdziemyodnośnikidowieluprzykładówjejwykorzystaniaimodyfikacji.Stosującomawianąmetodologięiustawiającodpowiedniezasadysterującemodelemmożnauzyskaćbardzoróżnorodnemodelesterowania<br />

obiektami.Zastosowanewalgorytmierozwiązaniasączęstotylkobaządotworzenianowych<br />

rozwiązańzupełnieróżnychproblemów.Przykłademmożebyćtutajzupełnienieprzypadkoweodniesieniedoalgorytmustadaprzyokazjiomawianiamechanizmówomijaniaobiektów<br />

wsekcji3.6.<br />

3.7.4.Zastosowania<br />

Algorytmznajdujeszczególnezastosowaniewgrach.Wwieluprodukcjachbyłużywanydo<br />

reprezentowaniamałychżyjątekwchodzącychwskładśrodowiska.Owadów,ptakówrybczy<br />

20 Aktualnyadres:http://www.red3d.com/cwr/<br />

59


innychprostychorganizmówreprezentującychraczejtłowydarzeń.Możebyćjednakużywanydoreprezentacjibardziejskomplikowanychiistotnychelementówrozgrywkijaktłumczy<br />

oddziałypostaci.WWiedźminiealgorytmstadazostałużytydoopisaniazachowaniamałych<br />

zwierzątekbudującychnastrójidodającychrealizmuświatagry,aleniemającychżadnego<br />

wpływunarozgrywkę.Dziękitemu,żekonfiguracjazachowaniazwierzątekwczytywanabyła<br />

zzewnętrznychskryptówLUA 21 ,byłyoneustawianeprzezprojektantów,bezbezpośredniego<br />

udziałuprogramisty.Możliwośćparametryzacjizachowaćumożliwiłaoparcienatymmechanizmiezwierząttakichjak:ptaki(czasamiobsiadającegniazda,bądźzwłokiiodlatującegdyktośsięzbliżał),żywyinwentarz(naprzykładkuryigęsi)lubinnemałestworzenia(żaby,myszyikoty),czynawetniekoniecznienależącedokrólestwazwierząt,psotliwegnomy.<br />

Szczególnieciekawebyłyjednaknietoperze,którenawidokwiedźminawzbijałysiędolotu,i<br />

przelatywałyobokniego,wyrzucanenastępniesiłąodpychającąleciałydalekowkierunkuz<br />

któregoprzyszliśmy,byjużniepowrócić.Wszystkietezachowaniaimplementowałjeden,w<br />

miaręspójny,mechanizm.<br />

Rysunek3.12:ZwierzątkaopartenaalgorytmiestadawgrzeWiedźmin.Czywypatrzysz<br />

przyczajonegowtrawiekota?<br />

3.7.5.Maelstorm<br />

NaalgorytmiestadaplanowałemoprzećsztucznąinteligencjęwMaelstorm.Algorytmjest<br />

bardzoprostykoncepcyjnieorazimplementacyjnie.Jegozastosowaniejestbardzointuicyjne<br />

iszczególnienadajesiędootwartegoświatawjakimtoczysięmojegra.Jedynąrzecząjaka<br />

stanęłaminadrodzebyłczasrealizacjicałegoprojektu.Niestetyniezdążyłemrozpocząć<br />

implementacjisztucznejinteligencjiwMaelstormibędzietojednazpierwszychrzeczyktórą<br />

zaimplementujęwprzyszłych<strong>praca</strong>chnadprojektem.<br />

21 Obiektowyifunkcyjnyjęzykprogramowania,stosowanyczęstowgrachjakojęzykskryptowylubdo<br />

definiowaniaGUI.Więcejinformacjimożnaznaleźćnastronieprojektu:http://www.lua.org/<br />

60


Nowościąbyłabypróbazamodelowaniawoparciuoalgorytmstadabardziejskomplikowanychakcji,jakatakowanie,unikaniewystrzałówczyrealizacjacelów.Wymagałobyto<br />

oczywiściewpewnychsytuacjachodejściaodbezstanowegocharakterualgorytmu.Kolejnym<br />

problemembyłabyimplementacjazachowaniastadnegoobiektów,któreniemogąbezpośredniozmieniaćswojegowektoraruchuidlaktórychtakazmianawymuszazastosowanieserii<br />

akcji(naprzykładobrótstatkuwkonkretnymkierunkuiwłączeniesilników/hamulców).Te<br />

problemyjednaktymbardziejmotywujądopróbyeksperymentowaniazrozwiązaniemopartymoalgorytmstadaipodjęciemsięstworzeniaciekawejlogikirozmytej,kontrolującejstatki<br />

kosmicznekomputerowegogracza.<br />

3.7.6.Dołączonyprogramdemonstracyjny<br />

PonieważnieudałomisięzawrzećimplementacjialgorytmustadawMaelstorm,dołączyłemdopracymagisterskiejinny,niewielkiprogrammojejprodukcji.Demonstracja”Park”<br />

toprostyprogramsymulującypewnezamknięteśrodowisko.Kontrolawiększościobiektów<br />

symulacjiopartajestnaalgorytmiestada.Wświeciegry”żyją”:<br />

•Robot—obiektgracza.Swobodnieporuszamysiępoparkuiobserwujemycosiędzieje<br />

naokoło.<br />

•Świetliki—małepasożyty.Trzymająsięwstadach.Rozmnażająsięmiędzysobą<br />

bezpłciowoiżerująnarosnącychwparkuroślinach.Uciekająprzeddrapieżnymisępami.<br />

•Sępy—ptaki.Nielubiąswojegotowarzystwaijeżeliakuratniemająochotysięrozmnażać,woląniewchodzićsobiewstrefęłowiecką.Bojąsięteżrobota.Żerująna<br />

świetlikach.<br />

•Rośliny—rosnąipowolutkusięrozmnażają.Sązjadaneprzezstadaświetlików.<br />

Byuzyskaćwiarygodnezachowanieświetlikówisępówużyłemnastępującychzasad:<br />

•Utrzymujwysokość—obiektystarająsięleciećnakonkretnejwysokości.Świetliki<br />

latajądelikatnienadziemiąbynieprzegapićroślinekioszczędzaćsiły.Sępynatomiast<br />

latająwysokobylepiejwidziećzwysokościswojeofiary.Gdysągłodnenurkująwdół<br />

naofiarę.<br />

•Unikajłowców—obiektyuciekająodłowców.Stadaświetlikówrozpierzchająsięwe<br />

wszystkiestronygdywpadniewniesęp,atenzkoleimusibyćkrytyczniegłodnyby<br />

zbliżyćsiędostadaświetlikówpilnowanegoprzezrobota.<br />

•Poluj—gdyobiektpoczujegłód,zaczynacorazbardziejpragnąćzbliżyćsiędoswojego<br />

pożywienia.<br />

•Szukajpartnera—cojakiśczasobiektymająmożliwośćprzedłużyćswójgatunek.<br />

Niespełnionepragnieniaoczywiściesiępotęgują.<br />

•Poruszajsię—pewną,lekkąpotrzebąbyłoporuszaniesięzokreślonąprędkościąw<br />

aktualnymkierunku.Dziękitemuświatnabrałdynamiki.Sępypatrolowałyokolicę,a<br />

stadaświetlikówszukałynowychźródełpożywienia.<br />

•Utrzymujdystans—podstawowezałożenieseparacjizpierwszychimplementacji<br />

CraigaReynoldsa.Utrzymujemyodpowiedniąodległośćodnajbliższegoczłonkastada.<br />

61


•Utrzymujkierunek—założeniewyrównania.Tutajrealizowaneprzeznaśladowanie<br />

prędkościikierunkunajbliższegoczłonkastada.<br />

•Podążajzastadem—założeniespójności.Świetlikidążądośrodkaciężkościwidzianegoprzezniestada.Sępygounikają.<br />

Wpowyższymopisiechciałemzwrócićuwagęnaintuicyjnośćstosowanychzasad.Intensywnośćzjakązasadawpływanaruchjestoczywiściezależnaodnatężeniadanegopragnieniaijegopriorytetu.ProgramParkpisałemprzezpółtoratygodnia,alealgorytmstadazadziałałwłaściwieodrazu.Pierwszadziałającawersjasymulacjizzaimplementowanymalgorytmemstada,wktórejpoprawionebyłypodstawowebłędyprogramistyczne,miałapoprawniedziałającysystemsztucznejinteligencji.Prostotategopodejściaumożliwiabardzołatwą<br />

konfiguracjęsystemu.Ponieważpracujemywśródwartościciągłychkonfiguracjaumożliwia<br />

intuicyjnetworzeniedosyćzróżnicowanychzachowańnapodstawiejednegosystemu.Gdybymmiałdalejrozwijaćdemonstrację”Park”,myślałembyeksperymentalniezróżnicować<br />

wmałymzakresieobiektydanegogatunku(lekkoróżnepriorytetypotrzeb)iwprowadzić<br />

możliwośćdziedziczeniacechprzezpotomków.Wbogatym,stabilnymśrodowiskupowinno<br />

toprowadzićdoewolucyjnejkonfiguracjiobiektów.<br />

Rysunek3.13:Demonstracja”Park”.<br />

62


3.8. Technikiprogramistyczne<br />

3.8.1.Alokacjapamięci<br />

Alokacjapamięcijestbardzoistotnąkwestiąwodniesieniudogierkomputerowych.Popierwszegrykomputerowepotencjalniesąaplikacjamiobardzodużymzapotrzebowaniunapamięć,zuwaginakoniecznośćprzydziałuzasobówpotrzebnychdowyświetlaniagrafiki.Drugąkwestiąjestiteracyjnycharakteraplikacji,któraprzetwarzaobiektywirtualnegoświatawielokrotniewtrakciesekundy.Jakiekolwiekbłędyzgubieniemalokowanychwskaźnikównasilająsięlawinowoiprowadządoutratystabilności.Dodatkowo,jeżeliwtrakcieturygrybędziemydokonywalidużejliczbyalokacjiizwalnianiapamięci,pozaoczywistymspowolnieniemaplikacji,pojawiąsięproblemyzfragmentacjądostępnejpamięcioperacyjnej.WtrzydziestodwubitowymsystemieWindowsXPpojedynczyprocesmadodyspozycjiniewięcejjakdwagigabajtypamięcioperacyjnej.WWiedźminiebyłybardzodużeproblemyzwystępowaniembrakupamięci.Oczywiściewszystkiekończyłysiębłędemkrytycznymizamknięciem<br />

aplikacji.<br />

Graczęstoniewykorzystywaławięcejjakgigabajtpamięci,alesystemniemógłjużprzydzielićjejspójnegoblokuwiększejdługości.Powodemtegobyławłaśniefragmentacja.Ją<br />

zkoleipowodowałazbytczęstaalokacjamałychblokówpamięciwciąguprzeciętnejtury<br />

gry.Usunięcietegoproblemuwymagałobardzodużejpracyisukceszostałosiągniętytylko<br />

częściowo,ponieważgrawchwiliwydaniamiaławciążpewneproblemyzestabilnością.<br />

Jednymzrozwiązańczęściproblemówzzarządzaniempamięciąjeststosowaniewłasnych<br />

lubzewnętrznychfunkcjialokacji.Szczególnietyczysiętosytuacjigdyprojektjestwzaawansowanymstadiumamymamyproblemyzestabilnościąlubwydajnością.Przykładem<br />

popularniestosowanego,zewnętrznegoalokatorajestnaprzykładbibliotekapoolwchodząca<br />

wskładdystrybucjiomawianejjużbibliotekiBOOST.Częstowłasnefunkcjealokacjisąw<br />

pewnymstopniuograniczonewstosunkudostandardowejimplementacjimalloc,alezdrugiej<br />

stronymogądziałaćdużoszybciejlubprzeciwdziałaćfragmentacji.<br />

ByobiektyklasyC++przyalokacjikorzystałyzespecjalnychmetodalokacjinależy<br />

przedefiniowaćdlanichoperatorynew()idelete().Otoprzykład:<br />

classWorldAction:publicSerializable{<br />

public:<br />

void*operatornew(size_tsz){returng_ActionAllocator.AllocGeneric(sz);}<br />

voidoperatordelete(void*p){g_ActionAllocator.FreeGeneric(p);}<br />

virtualvoiddoAction()=0;<br />

...<br />

};<br />

classWorldActionAddObject:publicWorldAction{<br />

public:<br />

void*operatornew(size_tsz)<br />

{returng_ActionAllocator.Alloc();}<br />

voidoperatordelete(void*p)<br />

{g_ActionAllocator.Free((WorldActionAddObject*)p);}<br />

voiddoAction();<br />

...<br />

};<br />

Naszoperatornew()wywołasięzakażdymrazemgdybędziemytworzyćobiektdanejklasy.W<br />

powyższymprzykładziejednak,jeżelibędziemyniszczyćobiektwirtualnejklasyWorldAction,<br />

63


należącywrzeczywistościdoWorldActionAddObject,wówczasjeżelidestruktorklasybazowejniebędziezadeklarowanyjakowirtualny,tojejoperatorzwalnianiazostaniewywołany.<br />

Inaczejujmująctrzebapamiętać,żeoperatorzwalnianiajestwywoływanyprzezdestruktor<br />

klasy.<br />

WMaelstormnaobecnymetapieprojektu,niemusiałemprzejmowaćsięproblemamialokacji.Dlawłasnejsatysfakcjiinaukinapisałemjednakswójalokatoripodpiąłemgodogry<br />

byprzydzielałpamięćdlaobiektówakcjigry.Todobrerozwiązanie,ponieważichalokacja<br />

byłapotencjalnymwąskimgardłemaplikacji.Ilośćpowstającychakcjibyłazależnaodliczbyobiektówgryigraczy,comogłoprowadzićdotego,żemocnoobciążonagramiałabypo<br />

pierwszeolbrzymieproblemyzfragmentacjąpamięci,apodrugiesamaalokacjazajmowała<br />

bybardzodużączęśćturygry.Rozwiązaniemktórezastosowałembyłonapisaniecyklicznego<br />

alokatora.Pomysłpewnieniejestoryginalny,alebyłwcałościmój.Alokatorposiadatablicę<br />

pozycjiktóremożeprzydzielić.Rozmiarjednostkialokacjijestdopasowanydośredniejwielkościnajczęściejalokowanychobiektówakcji.Jeżeliobiektwymagawiększejilościpamięci,rezerwujesobiekilkajednostekalokacji.Pamięćprzydzielanajest”pokolej”.Przechodzęzaalokowanynapoczątkuobszarpamięciprzydzielająckolejnejednostkialokacjiiodnotowując<br />

wdodatkowejtablicyktóreznichsązajęte.Gdydojdędokońcategoobszaru,zaczynam<br />

przydzielanieznowuodjegopoczątku.Ponieważakcjesąobiektamiozwykledosyćkrótkim<br />

czasieżycia,zakładamżeprzyponownymprzechodzeniutablicywiększośćpozycjibędziejuż<br />

ponowniewolna.Opisałemtorozwiązanieniezpowodujegowyjątkowości,aleraczejżeby<br />

pokazać,żeindywidualnaalokacjapamięcipowinnabyćdostosowanadospecyfikizarządzania<br />

obiektami.<br />

3.8.2.Profilowaniekodu<br />

Niewcześniejniżjakieśpółrokuprzedwydaniemgry,pracującynadWiedźminemzespół<br />

zorientowałsię,żegramazdecydowaniezbytwysokiewymaganiasprzętowe.Ponieważdystrybutornalegał,zresztąsłusznie,nakoniecznośćobniżeniaminimalnychwymagańgry,mały<br />

zespółprogramistów,wtymrównieżja,zostałdedykowanynakrótkiokresdopracwyłącznie<br />

narzeczoptymalizacjigry.Bardzoistotnymelementemtejpracybyłoznalezienieelementów<br />

mającychdecydującywpływnawydajnośćcałejaplikacji.Wielefunkcji,mimoewidentnej<br />

rozrzutnościobliczeniowejokazywałosięwywołanyminatylerzadko,żeniewartobyłopoświęcaćczasunaichpoprawę.Pierwszymużytymdotegocelumechanizmembyłozastosowaniewykresówwydajności.Zostałzdefiniowanyzbiórmakrodefinicjiktórewłączałyiwyłączałypomiarczasudlazdefiniowanegomechanizmuorazprostyzestawkomendpozwalającywłączyćiwyłączyćwyświetlaniewykresówwgrze.Wynikizbieranebyłycorundęgryiprezentowanenaekraniewformiezestawuprostychwykresów(patrzilustracja3.14).DziękizastosowaniumakrodefinicjikompilatoraC++możemyusunąćzupełniefunkcjonalnośćwykresówwydajnościwwynikowymkodzieaplikacji.Uzyskanezapomocątejmetodywynikiokreślajączasdziałaniakluczowychmechanizmówgry.Możnanajejpodstawiewyprowadzićpewneogólniejszewnioski.Brakujejednakszczegółowejwiedzy,codokładniestanowiłookoszciedanychmechanizmów.<br />

Wznalezieniusłabychpunktówaplikacjipodstawowąpomocąbyłprogramprofilujący,<br />

umożliwiającyzebraniedanychstatystycznych,natematczasuiczęstotliwościwywołańfunkcjizdefiniowanychwkodziegry.Przykorzystaniuzprogramuprofilującegoistotnebyłoby<br />

samprocesprofilowaniagryizbieraniadanychniezaburzałwyników.Wielokrotniespowalniał<br />

onwykonaniekodugry.Uruchamianynanormalnejkonfiguracjigry,powodował,żedziałała<br />

onazczęstotliwościąklatkinakilkasekund.Wynikiwówczasopisywałyzupełnieekstremal-<br />

64


Rysunek3.14:WykresywydajnościwgrzeWiedźmin.<br />

nąsytuację,któranigdyniemiałabymiejscawrzeczywistości.ByprofilowaćWiedźmina<br />

tworzonabyłakompilacja,wktórejfunkcjaliczącaprzepływczasubyłakilkudziesięciokrotniespowalniana.Beztejprostejfunkcjonalności,przeprowadzonetestypozbawionebyłby<br />

jakiejkolwiekużyteczności.<br />

Kolejnymistotnymelementembyłakoniecznośćodpowiedniodobranegomomentuprzeprowadzaniatestu.Programprofilującyzaczynałdziałaćdopierojakiśczaspowłączeniurozgrywkiorazprzejściukilkupierwszychkroków,takbyfunkcjedoczytująceelementylokacjigryniezdominowałyiniezaburzyływynikówtestu.Wtrakciejegodziałaniastaraliśmy<br />

sięsterowaćpostaciągry,omijającelementyrozgrywki,któremogłybyzaburzyćwynikitestu.<br />

Naprzykładistotnebyłobynierozpoczynaćdialogów,którychwystąpieniemiałoglobalny<br />

wpływnasymulacjęmechanikigryorazwyświetlanie.<br />

Wynikitestówdawałynambardzodokładnąwiedzęnatematkażdejfunkcjiwkodziegry.<br />

Mieliśmyinformacjenatemattegoilerazybyławywołana.Wiedzieliśmyileczasuaplikacja<br />

poświęciłanawykonaniejejkoduorazwywołaniekażdejzfunkcjiwniejzagnieżdżonych<br />

zosobna.Napodstawietakichdanychmogliśmyjużnietylkostwierdzićjakiemechanizmy<br />

miałynajwiększynegatywnywpływnawydajnośćgry,alerównieżznaleźćtegoprzyczynyi<br />

prawdziwewąskiegardłaaplikacji.<br />

65


Rozdział4<br />

Podsumowanie<br />

<strong>Moja</strong><strong>praca</strong><strong>magisterska</strong>byłdlamnieokazjądozdobyciadodatkowegodoświadczeniaoraz<br />

własnychposzukiwańiprzemyśleńdotyczącychprogramowaniaawszczególnościtworzenia<br />

gierkomputerowych.WtokupracnadprojektemMaelstormOnline,którerozciągałysięna<br />

przestrzenitrzechlat,jakoprogramistastarałemsięrozwijaćindywidualnieizawodowo.Sam<br />

projektbyłmimożliwościądowielueksperymentówprogramistycznychikontaktuznowymi<br />

dlamnieproblemami.<br />

Wczęściteoretycznejpracychciałempokrótceprzedstawićtematykętworzeniagieroraz<br />

przybliżyćkilka,wybranychaspektówzniązwiązanych.Wprezentowanychwrozdziale3rozwiązaniachpopularnychproblemówprogramistycznychtworzeniagier,starałemsięprzedstawićwłasnerozwiązaniatychkwestiiorazpróbowałemprzeprowadzićdyskusjęróżnorodnych<br />

sposobówpodejściadoproblemu.Starałemsięprzytympokazaćjakbardzoistotnyjest<br />

świadomydobórużytychrozwiązańnapodstawiespecyfikitworzonejgry,przymożliwym<br />

zachowaniuichuniwersalności.<br />

Grykomputerowesądosyćspecyficznymdziałemprogramowania.Otym,żemożnasię<br />

nimizajmowaćzawodowoprzekonywałemwrozdziale1.Osobiścieuważamtworzeniegier<br />

zaszczególnieinteresującezprogramistycznegopunktuwidzenia,zuwaginabardzoszeroki<br />

wachlarzproblemówjakistawiająprzedprogramistą.Wciążdlawiększościznichniema<br />

idealnychizawszeskutecznychrozwiązań.Istniejejeszczebardzodużepolemanewrudo<br />

tworzeniazupełnienowychtechnikprogramistycznych,wzorcówprojektowychialgorytmów.<br />

Choćtworzeniegiersprowadzasięzwykledopodobnegoprocesu,niemożnasobiepozwolić<br />

napowtarzanieutartychschematów.Kolejneprodukcjezarównopodwzględemprojektujak<br />

iimplementacjipoprostumusząsięzmieniać.Tak,byzakażdymrazemmócprzyciągać<br />

uwagęgraczykuszącichnowąjakościąizaskakującnowymielementamirozgrywki.<br />

4.1. Wnioskidotycząceprojektu<br />

MaelstormOnlinewchwiliobecnejjestmałąiprostągrąakcjidlawielugraczy.Możliwajest<br />

dalekoidącąrozbudowaprojektuistworzenienajegosilnikudużobardziejskomplikowanej<br />

rozgrywki.Założeniaprojektu,któreprzyjąłemnapoczątku,zarównotedotyczącewizjifunkcjonalnościprojektuorazarchitektury,wciążuważamzaaktualne.Mechanizmsynchronizacji<br />

woparciuozdarzeniagrywdużymstopniusprawdziłsięwpraktyce.Implementacjawydajnej<br />

izapewniającejsynchronizacjękomunikacjibyłazapośrednictwemtejmetodydużoprostsza<br />

wporównaniudostandardowegopodejściaimplementacjisieci.OczywiścieMaelstormOnline<br />

odstronymechanizmówrozgrywkibyłbardzoprostymprojektem,dlategopozostajeotwartympytaniejakrozwiązanietobędziesięskalowaćdosystemówwktórychobiektywchodzą<br />

67


wdużobardziejskomplikowanąinterakcjęmiędzysobą.<br />

4.2. Testyaplikacji<br />

AplikacjaMaelstormOnlinebyłatestowanawkonfiguracji,którazostałaoddanazpracą<br />

magisterską.Pozapróbągryprzezinternetbyłatestowanawydajnośćsilnikagryaplikacji<br />

serwera.Chciałemodnaleźćzależnościorazlimitydotyczącekomplikacjisymulowanegoświata.Ilośćobiektów,któremożeonobsłużyćizależnośćwydajnościodrozmiaruprezentowanego<br />

świata.<br />

4.2.1.Warunkitechniczneprzeprowadzonychtestów<br />

GratestowanabyławyłączniepodsystememWindowsXP.Najsłabsząkonfiguracjąnajakiej<br />

byłauruchamianaaplikacjakliencka,byłkomputerklasyPentiumIV2.8MHzwyposażony<br />

w512MBpamięciRAMorazkartęgraficznąATIRadeon9550.Aplikacjadziałałanatej<br />

konfiguracjisprzętowejbezzarzutówiwydajesię,żepowinnadziałaćrównieżnasłabszych<br />

komputerach.WtrakcietestówaplikacjaklienckadziałałanakomputerzeklasyIntelCore<br />

2QuadQ66002.4MHzwyposażonymw2GBpamięciRAM.Serwerpodłączonybyłz<br />

internetemzapośrednictwemrouterasiecilokalnej.ŁączezinternetembyłołączemADSL<br />

udostępnianymwramachusługiNeostradazpasmemodbioruokoło2Mb/s,awysyłaniem<br />

256Kb/s.Innekomputeryłączyłysięzserweremzapośrednictwemsiecilokalnejorazza<br />

pośrednictweminternetu.Łączącesięzapośrednictweminternetukomputerydysponowały<br />

łączemADSLoprędkośćodbioruconajmniej1Mb/s,choćturównieżwydajesię,żedo<br />

płynnejgryiwydajnejsynchronizacjistarczyćpowinnodowolnełączeklasyDSL/ADSL<br />

bądźszybsze.<br />

4.2.2.Wynikitestów<br />

Podstawowetestypolegałynagrzepomiędzytrójką,bądźdwójkągraczypołączonychzapośrednictweminternetu.Testyoceniamdosyćpozytywnie,wnormalnychwarunkachopóźnieniaspowodowanekomunikacjąniewpływałynarozgrywkę.Występowałyjednaksporadyczneproblemyzwiązanezsynchronizacjązegara.Wichwynikuakcjeprzychodziłyzaplikacjiklienckiejzkilkusekundowymopóźnieniemcodanemugraczowiuniemożliwiałogrę.Pozostałe,pomniejszebłędyzsynchronizacjązostaływyłapaneipoprawione,wwiększościjeszczew<br />

trakcieprowadzonychtestów.<br />

Testywykazałypoprawnośćzastosowanegomechanizmu.Wtrakciepracnadgrąregularniebyłaonasprawdzanawdziałaniuprzezsiećlokalną.Niebyłempewienjakgrazachowasię<br />

podwpływemwiększychibardziejprzypadkowychopóźnień.Testywtejformieniestetynie<br />

odpowiadająnapytanie,odnośniepotencjałuiskutecznościzastosowanychrozwiązań.Potrzebnesątestyaplikacjiprzydużymobciążeniukomunikacyjnymzsieciinternet.Należałoby<br />

przeprowadzićtestyaplikacjiserwerawsytuacjigdypodłączonabędziedoniejbardzoduża<br />

ilośćzdalnychkomputerów.Takietestysądosyćtrudnedozaplanowaniaiprzeprowadzenia.<br />

Niestetyniezdołałemichwykonaćprzedoddaniemniniejszejpracy.<br />

Drugimrodzajemprzeprowadzonychtestówbyłytestywydajnościmechanikigry.Ichrezultatybyłybardzozadowalające.Naserwerzegrybyłyregularnie,copięćklatektworzone<br />

noweobiektyasteroid,poruszającesięzlosowąprędkościąwlosowymkierunku.Byłustalony<br />

naichliczbęodgórnylimittrzechtysięcy.Światgrybyłnieduży,takbyczęściejdochodziło<br />

dointerakcjiasteroid(obiektycałyczaszderzałysięzesobą).Aplikacjaserwerawykonywała<br />

szesnaściekrokówsymulacjinasekundę.Tomyślęjestoptymalnaczęstotliwośćsymulacjii<br />

68


przytakiejteżpracowaławtrakcietestówprzezsieć.Przytrzechtysiącachobiektówaplikacja<br />

serweradziałabezzarzutuwłaściwienieobciążającsystemu.Działałateżbardzorównoiani<br />

razuniezdarzyłojejsięwyjśćpozaprzypisanynaklatkęserweraczas.Zapierwszymrazem<br />

uruchomiłemjąwnormalnejkonfiguracjigry.Wwynikukolizji,którepowodowałyuszkodzeniaiwkonsekwencjiniszczenieobiektówgry,ichilośćprzestałaprzyrastaćokołopoziomu<br />

1900asteroid.Mimociągłejdestrukcjiitworzeniaobiektówcoświadczyłoodosyćmocnym<br />

obciążeniumechanikigryrozpatrywaniemkolizji,aplikacjadziałałaswobodniewykorzystując<br />

bardzomałąilośćzasobówsystemowych.Około10MBpamięcioperacyjnejorazminimalnie<br />

wykorzystującsiłęobliczeniowąprocesorów,mniejniżwieleinnychdziałającychprocesów.<br />

Następniewłączyłemzadawanieuszkodzeńijeszczerazrozpocząłemtest.Przytrzechtysiącachobiektówzalogowałemsięnaserwerwłączającaplikacjękliencką.Obiektybyłybardzociasnoułożone.Niektórepowolisięporuszałyaleodrazuprowadziłotodozderzeń.Niestetytestbyłmiarodajnytylkowograniczonymzakresie.Wielepotencjalniekosztownych<br />

mechanizmówdziaławyłączniewodniesieniudozdalnychgraczypołączonychzserwerem.<br />

Przykłademjesttusprawdzaniewidocznościorazkontrolarozsyłaniaakcjiwyłączniedowidzącychjegraczy.<br />

Wynikitestówskłaniajądowniosku,żeprzynajmniejjednozzałożeńwydajnościowych,<br />

stawianychprzedgrąmożebyćspełnione.Nawetjeżeli,niebędzieonawstanieobsłużyć<br />

ponadstupołączeń,wyglądanato,żezasobykomputerapotrzebnedoobsługimniejszej<br />

ilościgraczy,będąpozwalałynauruchomieniewielujejegzemplarzy.<br />

Rysunek4.1:AplikacjaserweraMaelstormwtrakcietestówwydajnościowychmechaniki.<br />

4.2.3.Horyzontyrozbudowyprojektu<br />

Jestwieleelementówktóreniezostałyzaimplementowanezuwaginaograniczeniaczasowe<br />

projektu.Większośćznichnaobecnymetapieniebyładofunkcjonowaniagryniezbędna.<br />

Przyrozwojuprojektuwpierwszejkolejnościnależałobysięzająć:<br />

•Możnapoprawićwydajnośćkomunikacji.Przykłademjestprzesyłaniemałychobiektów,<br />

takichjakpociski,przezsieć.Częśćobiektówmożebyćwczytywanadogryzarównopo<br />

stronieklientajakiserwera.<br />

•Należypoprawićbezpieczeństwoaplikacjiserweranawypadekpróbpołączeniasięprogramówklienckichwykorzystującychsłabościjegoimplementacji.<br />

69


•Brakujeinteligentnychobiektówniezależnych.Żałuję,żeniemiałemmożliwościimplementacjisztucznejinteligencji.<br />

•Graczepowinnimóctworzyćstatkizdużowiększądowolnością.Graczpowinienmóc<br />

konfigurowaćkażdywchodzącywskładmyśliwcapodsystem.Podsystemypowinnymieć<br />

widocznywpływnawyglądstatku.<br />

•Potrzebyjestrozwójmodułuwyświetlania,noweefektywizualneianimacjeorazprzyjemniejszadlaokaszatagraficznaGUI.<br />

•Kodpowinienzostaćtakzorganizowanybyrozdziałnaaplikacjęklienckąiserwerabył<br />

dużoprostszyiczytelniejszy,jednocześniezachowującpozytywneaspektyobecnego<br />

rozwiązania.Aktualnerozwiązaniezzastosowaniemmakrodefinicjimożenieskalować<br />

siędowiększegoprojektu.<br />

•Słabympunktemmojegosilnikamożebyćpełnasynchronizacjazegarapostronieaplikacjiklienckiejzzegaremserwera.Różnicewpomiarzeczasupomiędzykomputeramimogąwkonsekwencjiprowadzićdoutratysynchronizacjigry.Natknąłemsięjużnaciekawerozwiązaniategoproblemu.MiędzyinnymikompletneopracowaniedotyczącetejkwestiimożnaznaleźćwartykulePropagationofVisualEntityPropertiesUnderBandwidth<br />

Constraints,napisanymprzezOlivieraCado,opartymnadoświadczeniachwpracynad<br />

komercyjnymigramiMMORPG.Artykułjestdostępnynaserwisiegamasutra[GS]pod<br />

adresemhttp://www.gamasutra.com/view/feature/1421/propagationofvisualentity.php.<br />

Jakjużwspominałemwrozdziale2.4tworzącmojąpracęmagisterskąmiałemnauwadze<br />

dużowiększyprojekt,któregoelementemskładowymbyłabygraMaelstormwformiezbliżonejdoobecnej.Projektującaplikacjęchciałembymogłaonastaćsięczęściąrozproszonego<br />

systemugrydlabardzodużejliczbygraczy(MassiveMultiplayerOnline).Zakładałem,że<br />

jeżeliwMaelstormbędziemogłonarazspotkaćsiępowyżejstugraczy,lubjeżelinapojedynczymkomputerze,będziemożnauruchomićkilkaaplikacjiserweraobsługującychróżnerozgrywkidlamniejszejliczbygraczy,wówczasgramogłabystworzyćarchitekturęrozproszoną.Centralnympunktemtejarchitekturybyłbyserwergry”społecznej”.Byłabytozupełnie<br />

nowaaplikacja,pozbawionaelementówzręcznościowychiwswoimdziałaniudużobardziej<br />

przypominającaserwisinternetowyopartynabaziedanych.Aplikacja”społeczna”symulowałabyfunkcjonowanierozmieszczonychwpasieasteroidówstacjikosmicznych.Graczezajej<br />

pośrednictwemmoglibyszukaćnowych,wypełnionychakcjązadańorazwydawaćzarobione<br />

wtrakcieichrealizacjipieniądze.Opowiadaćoszerszejkoncepcjiprojektumożnabydługo.<br />

Chciałempoprostuzaznaczyć,żeprojektMaelstormOnlinewswojejobecnejpostacinie<br />

powinienbyćtraktowanyjakoostatecznyprodukt.Tokompletnysilnikumożliwiającyimplementacjędużobardziejrozbudowanejrozgrywki.Maperspektywyrozwoju,którychrealizacja<br />

umożliwiłabystworzenienaprawdęatrakcyjnejgry.<br />

70


DodatekA<br />

Materiałydostarczonewrazzpracą<br />

magisterską<br />

Opróczniniejszegoteoretycznegoopracowania,domojejpracymagisterskiejdołączonajest<br />

płytaCD.Zawieraonamiędzyinnymirealizacjępraktycznejczęścipracymagisterskiejwpostacikoduźródłowegoorazbinarnej,skompilowanejwsystemieWindows.Otospiszawartości<br />

dołączonejpłytyzgrą:<br />

•/maelstorm/source/—KodźródłowygryMaelstormOnline.Wrazzkodemdołączone<br />

sąplikiprojektuVisualStudio2005.Wtymśrodowiskuzalecamewentualnąkompilację<br />

kodu.<br />

•/maelstorm/binary/ —ArchiwumzawierająceskompilowanąidziałającąnaplatformieWindowsgręMaelstormOnline.Byjąuruchomić,należyuprzedniorozpakować<br />

archiwumnanośnikomożliwościzapisuiodczytu(najlepiejdysktwardy).Szczegóły<br />

dotyczącekwestiiużytkowaniagryznaleźćmożnawplikureadme.txt.<br />

•/documentation/<strong>praca</strong><strong>magisterska</strong>.pdf—Niniejsza<strong>praca</strong><strong>magisterska</strong>wwersjielektronicznej.<br />

•/documentation/source/—KatalogzawieraplikiźródłowewformacieLaTeX,napodstawiektórychzostałwygenerowanydokumentpracymagisterskiej.<br />

•/additional/WizjaMMOAsteroids.pdf —Dokumentwizji,którypowstałw2004roku<br />

idotyczyłprojektumojejprzyszłejpracymagisterskiej.<br />

•/additional/Prezentacja27.V.2007.ppt —Prezentacjapracymagisterskiejdotycząca<br />

jejstanuzdnia27.V.2007roku.<br />

•/additional/illustrations/ —Katalogzawierającywysokiejrozdzielczościilustracjedo<br />

pracymagisterskiej.<br />

•/additional/flocking/source/—Kodźródłowyaplikacjisymulującejzachowaniestada,<br />

októrejwspominałemwrozdziale3.7.<br />

•/additional/flocking/binary/—Skompilowanawersjademonstracyjnegoprogramusymulującegozachowaniestada.<br />

71


Bibliografia<br />

[DLo1]MarkDeLoura,PerełkiProgramowaniaGiertomI,2002Helion.<br />

[DLo2]MarkDeLoura,PerełkiProgramowaniaGiertomII,2002Helion.<br />

[DLo3]MarkDeLoura,PerełkiProgramowaniaGiertomIII,2003Helion.<br />

[AKi4]AndrewKirmse,GameProgrammingGems4,2004CharlesRiverMedia.<br />

[TW07]Wiedźmin:GraKomputerowa(ang.TheWitcher:Role-PlayingGame),2007CD<br />

ProjektRED.http://www.thewitcher.com<br />

[GS]SerwisinternetowyGamasutrahttp://www.gamasutra.com<br />

[bOGR]Ogre3D,bibliotekagraficznahttp://www.ogre3d.org<br />

[bGUI]CEGUI Crazy Eddie’s Gui System, biblioteka interfejsu użytkownika<br />

http://www.cegui.org.uk<br />

[bAIO]ASIO,AsynchronousInputOutput,bibliotekasieciowahttp://www.libsdl.org<br />

[bSDL]SDLSimpleDirectMediaLayer,bibliotekamultimedialnahttp://www.libsdl.org<br />

[CR]CraigRaynolds,stronapoświęconaalgorytmowistadahttp://www.red3d.com/cwr/<br />

73

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!