Zastanawiałeś się jak to się dzieje, że widzisz ruchy bohatera należącego do gracza mieszkającego na drugiej półkuli? Albo dlaczego nie możesz w MMORPGu ustawić sobie nieskończonej ilości życia i many jak w grach singlowych? Dziś pora na lekcję tego, jak działają gry MMORPG. Oczywiście w dużym uproszczeniu.
Jak to się zaczęło?
Historia MMORPG to temat na całkowicie nowy wpis, ale kilka interesujących faktów warto przytoczyć. Jednym z najważniejszych wynalazków bez których nie zagrałbyś w Tibie, WoWa czy ►Lineage 2 bez wątpienia jest MUD.
Pełna nazwa to Multi User Dungeon, czyli gatunek tekstowych gier RPG, które pozwalały użytkownikom wcielić się w role wojowników i magów… Aczkolwiek wciąż duża część gry odgrywała się w głowie samego użytkownika, bo aplikacja mogła zaoferować co najwyżej konsolę i tekst.
Godnym zapamiętania z tego gatunku jest MUD-1 z 1978, którego autorem był Roy Trubshaw i Richard Bartle. Gra, która została uruchomiona na ogromnym molochu zwanym DEC PDP-10. Jednak najważniejszą kwestią było uruchomienie MUD-1 w sieci uniwersytetu Essex i zniweczenie marzeń studentów o godnym życiu w przyszłości.
Początki uzależnienia od MMORPG
MUD-1 zwany był również Multi Undergraduate Destroyer z tego względu, że wielu studentów poświęcało się tej grze tak bardzo, że brakowało im czasu na naukę i przez to nie kończyli studiów. Był to przełomowy moment w grach MMORPG i ich rozwój znacznie, znacznie przyspieszył.
Pionierem wśród komercyjnych Massively Multiplayer Online Role Playing Games stał się Island of Kesmai. Nie do końca jednak można nazwać go “Massively”, bo jednocześnie mogło się bawić tylko 100 graczy, a każda godzina w sieci kosztowała aż 12$! Jednak ludzie nie zważali na koszta, a to z kolei pchnęło gry MMO jeszcze dalej.
Pierwszym graficznym MMORPGiem był Neverwinter Nights (nie mylić z grą BioWare). Za część projektową odpowiadał Don Daglow, a za kod Cathryn Mataga. Gra ujrzała światło dzienne w 1991 roku i funkcjonowała aż przez 6 lat na systemie sieci zwanym America Online. Koszt zabawy wynosił 6$ na godzinę.
MMO spuszczone z kagańca
Wróćmy jeszcze na chwilę do America Online. Były to usługi sieciowe, które w uproszczeniu odpowiadały za połączenie graczy w każdym MMO. Usługi takie były oferowane przez wiele różnych firm, ale wciąż nie można było tego nazwać dzisiejszym internetem, ponieważ każda taka usługa była ograniczona przez NSFNET (National Science Foundation Network). Gry MMORPG przypominały stugłowego cerbera, który chciał się wyrwać i ruszyć na podbój świata, ale smycz NSFNET skutecznie go powstrzymywała.
Jednak w drugiej połowie lat 90. NSFNET odpuściło i większość restrykcji została zniesiona, rozwój gier MMORPG ponownie wystrzelił, a pierwszym MMORPGiem wypuszczonym do internetu został Legends of Future Past. Jako pierwsza gra z tego gatunku posiadała kadrę Game Masterów odpowiedzialnych za nadzorowanie graczy i organizowanie eventów. Później nastały czasy Ultimy Online, ► Tibii, ► World of Warcraft… Czyli coś znacznie bliższego naszym czasom. Przejdźmy w końcu do tego jak działają gry MMORPG.
Partnerzy idealni?
Dwie rzeczy są pewne w MMORPG – klient oraz serwer. Klient znajduje się po stronie każdego gracza i to jest to, co instalujemy, gdy chcemy przenieść się do alternatywnej rzeczywistości. Serwer to sędzia, który trzyma stronę twórców, a my, zwykli śmiertelnicy, możemy co najwyżej poprosić go o różne rzeczy.
Załóżmy, że chcemy, aby nasz heros zrobił kilka kroków w stronę naszego kursora. Musimy kliknąć w wybrane miejsce i tym samym wysłać prośbę do serwera o wykonanie ruchu. Serwer analizuje nasze zapytanie, następnie zmienia parametry naszej postaci, a później nasz klient nam to wyświetla, w tym przypadku przemieszczającą się postać.
Nie do końca…
Jednak jeśli serwer musiałby analizować wszystkie parametry postaci na serwerze, gdy te chcą się tylko ruszyć, to zwykłe poruszanie się obarczone byłoby niesamowitym opóźnieniem. Wynikałoby to z przesłania, przeanalizowania, a następnie odesłania informacji o kilkudziesięciu parametrach. Gdybyśmy mieli szczęście, to może w 300 milisekundach byśmy się zmieścili, ale to chyba żaden komfort?
Z pomocą przychodzi optymalizacja wymiany danych. Po co wysyłać do serwera informację o ilości naszego zdrowia, many czy ataku, skoro chcemy się tylko ruszyć? W paczce, którą wysyłamy do serwera wystarczy, że zawrzemy naszą aktualną pozycję i pozycję, na którą chcemy się przemieścić. Dzięki temu ilość danych/zapytań wysyłanych na serwer będzie uzależniona tylko od ilości graczy na serwerze, a nie od ilości parametrów, którymi opisane są postacie.
Ale trójkącik już jak najbardziej
Sprytni ludzie wpadli na jeszcze jeden pomysł. Po co wysyłać z klienta na serwer aktualną pozycję postaci skoro to jest parametr, który bardzo często się zmienia i niepotrzebnie zapycha komunikację. Tutaj z pomocą przyszła baza danych. Baza danych jest takim regałem, na który serwer może sięgnąć w dowolnej chwili po parametry naszej postaci. Jeśli serwer potrzebuje jeszcze szybszego dostępu do danych zawsze może skorzystać z pamięci podręcznej, a dzieje się tak w trakcie różnego rodzaju obliczeń np. obrażeń w mobka posiadającego określone odporności.
Podsumowując – serwer odbiera prośbę o poruszenie danej postaci, zbiera jej aktualną pozycję z bazy danych, odpowiednio ją modyfikuje korzystając z informacji, które znajduje w pamięci podręcznej, a następnie odsyła z powrotem do klienta. Wszystkie dokonane zmiany aktualizuje również w bazie danych.
Więcej serwerów, więcej!
Mimo wszystko wygląda na to, że taki serwer ma niezły zapierdol. Na szczęście powstał pomysł jak mu ulżyć. Wystarczy podzielić go na większą ilość serwerów w zależności od funkcji jakie będą spełniały.
Na pierwszy ogień idzie proxy serwer. Serwer o bardzo dużej przepustowości, który na tyle dobrze i sprytnie zarządza komunikacją, że opóźnienie, wynikające z łączenia się z serwerami oddalonymi o tysiące kilometrów, jest całkiem znośne.
Po uruchomieniu klienta musimy pobrać patche, więc czemu by nie stworzyć Patch Servera, który tym się zajmie? W końcu aktualizacje potrafią być naprawde spore i niepotrzebnie będą zapychać łącze. Gdy już uda się zaktualizować klienta, to jakoś trzeba się zalogować, wyświetlić status o populacji poszczególnych serwerów i tak dalej, więc tutaj też warto dorzucić ustrojstwo zwane Login Serverem.
Na koniec dostajemy się do upragnionego World Servera, ale jemu też byłoby ciężko kontrolować graczy np. na dwóch różnych krańcach Azeroth czy w kilkuset różnych Summoner’s Riftach. Dlatego właśnie, niczym mądry szef, World Server tworzy w czasie rzeczywistym Game Servery, który obsługuje różne fragmenty świata MMORPG lub nadzorują rozgrywkę w różnych bitwach League of Legends.
Tutaj zatrzymam się jeszcze przy Game Serverach, a właściwie Area Serverach. Napisałem, że obsługują one różne części świata MMORPG i wszystko brzmi super, ale do czasu. Zwróć uwagę jak sprawa się komplikuje, gdy gracz z pierwszego Area Servera oddziałuje na gracza znajdującego się na sąsiadującym Area Serverze. Wymagana jest wtedy wymiana danych pomiędzy tymi serwerami, a gdy takich przypadków jest więcej to włosy programisty mogą przybrać siwy odcień.
Czy serwer naprawdę jest konieczny?
A co gdyby pominąć te całe serwery wraz z bazą danych, pamięcią podręczną i sprawić, żeby klient MMORPGa sam obliczał przemieszczenie postaci, a następnie wysyłał je do pozostałych klientów? Przecież dzięki temu mielibyśmy większe moce przerobowe w obliczaniu parametrów, bo wykonywałby je nasz komputer tylko dla jednej postaci, a do tego wysłalibyśmy gotowe dane bez konieczności czekania na odpowiedź!
Wyobraź sobie partyjkę w ► League of Legends. Grasz Ezrealem i to Ty uznajesz czy trafiłeś skillshotem, czy udało Ci się dobić mobka i czy wystarczy Ci kasy na jakiś itemek… No powiedz tylko, że nie naciągnąłbyś zasad na swoją korzyść. Oczywiście, że tak. Po ludziach trzeba się spodziewać, że będą szli na łatwiznę, bo taką mają naturę.
Właśnie dlatego potrzebny jest serwer, niezależny i obiektywny arbiter. Gdyby klient miał możliwość manipulowania parametrami, to każdy gracz ustawiłby swój atak i hp na niebotycznie wysokie wartości, a w grze spotykalibyśmy głównie oszustów. O ile w grach single player każdy może grać tak, jak mu się podoba, o tyle w MMO wszystkich obowiązują te same zasady.
Są jednak drobne wyjątki. Możemy zmodyfikować klienta w taki sposób, żeby nie zmieniał danych wysyłanych na serwer. Mowa tutaj o wszelkich zmianach w interfejsie na przykład poprzez Addony. Czasem dopuszczalne są również zmiany graficzne, ale to pod warunkiem, że na przykład nie ułatwią lokalizowania przeciwnika.
Gdy internet wyleje się z wiaderka
Wiemy już, że klient odpowiada za przedstawienie graczowi tego, co dzieje się grze oraz może wysyłać zapytania do serwera. Serwer z kolei jest sędzią zdarzeń w grze, a baza danych i pamięć podręczna są jego pomagierami w zarządzaniu całym MMORPGiem. Teoretycznie wiemy jak działają gry MMORPG, ale pod jednym warunkiem.
Warunkiem, że nasz internet jest niezawodny. Gdy połączenie naszego klienta z serwerem zawodzi, to zamiast płynnego biegania naszej postaci zobaczymy jej teleportację. Wynika to z tego, że gdy wymieniamy się danymi z klientem np. co 20 milisekund, to część z tych pakietów po prostu przepada. Dostajemy informację zwrotną o aktualnej pozycji naszej postaci np. dopiero po 1 sekundzie i widzimy skok postaci na ekranie.
Jak temu zaradzić? Ano całkowicie się nie da, ale można zastosować interesujący patent. Skoro gubimy niektóre pakiety danych, to może wprowadźmy opóźnienie w komunikacji, powiedzmy 2 sekund. Dzięki temu jeśli nawet stracimy jakieś pakiety, to przez to, że mamy opóźnienie jesteśmy w stanie zebrać brakujące dane w kolejnych iteracjach komunikacji i dzięki temu klient jest w stanie zaprezentować płynny ruch, choć opóźniony o dwie sekundy.
Możliwe jest również delikatne ograniczenie opóźnienia. Jeśli klient otrzyma dane na początku, później kilka straci, a na końcu znowu otrzyma poprawne dane, to brakujące pakiety można wyliczyć na podstawie początkowego i końcowego stanu danego obiektu. Dzięki temu nie trzeba czekać aż dwóch sekund na uzupełnienie brakujących pakietów, bo części z nich serwer lub klient są w stanie się domyślić.
Jak działają gry MMORPG?
Tyle w temacie jak działają gry MMORPG. Uproszczeń w tym artykule było od groma, ale nie piszę poradnika programowania, tylko lekki wpis na piątkowe popołudnie, więc mam nadzieję, że spędziłeś miło czas… Bez względu na to czy jesteś zielony w temacie, czy też zjadłeś zęby na optymalizacji komunikacji w MMORPGach. Życzę miłego dnia i słyszymy się na streamach, a niedługo start MMORPGowego serwera Discord 😉