Skocz do zawartości

Komunikacja między klientami w grach MMORPG


Adix3

Polecane posty

Witam.

 

Jestem tu nowy, jak widać ;p Od pewnego czasu zastanawia mnie w jaki sposób wygląda wymiana informacji pomiędzy klientami w grach MMORPG.

 

Od jakiegoś czasu gram w Air Rivals. W grze tej się lata samolotami i strzela. Trzeba było ściągnąć klienta gry i go zainstalować, to wiadomo. Z jakiś 1 miesiąc temu udało mi się postawić na moim komputerze serwer do gry podobnej do tej z tym że to była starsza wersja i nazywała się Flysis. Wszystko chodziło ok. Trzeba było tylko zainstalować baze danych MySQL, wczytać bazę (do Flysis) pobraną z internetu, oraz odpalić 4 programiki które robiły za cały serwer. Jeden był to jakby główny serwer, drugi był to serwer mobów (odpowiadał za ruch mobów i rakiet), trzeci - zabezpieczający- sprawdzał zgodność plików na serwerze, itp, czwarty nawet już nie pamiętam od czego był, ale chyba od komunikacji głosowej między graczami.

 

Chciałbym się dowiedzieć w jaki sposób działa taka wymiana informacji pomiędzy klientami gdy. Z tego co mi sie wydaje to baza danych ma tylko na celu przechowywać informacje o graczu takie jak: login, ilość wirtualnej waluty, wyposażenie statku, poziom doświadczenia, itp. A te 4 programy które trzeba było odpalić (ten serwer cały) to wydaje mi się że one komunikują się z klientami za pomocą Socketów (czy jakoś tak) czyli przez TCP/IP.

 

Tak na mój rozum to te 4 programy zbierają informacje od każdego z klientów zainstalowanych na komputerach graczy o położeniu samolotu, itp. i rozsyłają je do pozostałych klientów w celu dokonania korekcji położenia samolotu każdego gracza. I w dodatku aktualizują baze danych o nowe informacje typu, drapnięcie nowego przedmiotu, wzrost doświadczenia, itp.

 

Wydaje mi się też ze cała fizyka np odbicie od podłoża, zderzenie z przeszkodą jest realizowana przez każdego z klientów a do serwera są przesyłane tylko informacje o położeniu itp. Chyba że serwer zbiera informacje o położeniu i on wykonuje cała fizykę a następnie wysyła nowe informacje o położeniu do klientów?

 

Jeżeli to dobrze rozumiem to czy taki transwer danych za pomocą socketów/przez TCP/IP nie jest za wolny?? a może to inaczej jest robione??

 

Wiem że męczę, i dużo można by pisać w tym temacie ale jestem ciekawy tego i mogą być informacje takie w skrócie ;p

 

Pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Za pewne klient z serwerem komunikuje się za pomocą własnego protokołu. Mogę ci powiedzieć jak to jest na podstawie Tibi w którą grałem i swojego czasu miałem (mam) bota który operuje na pakietach.

 

Gdy gracz wykonywał jakąś akcję w grze to klient szfrował tę informacje w ciąg liczb zdaje się iż był to typ Cardinal i za pomocą specjalnego algorytmy serwer odszyfrowywał go po swojej stronie. Czyli np ciąg jaki zostawał wysłany do serwera wyglądał (po odszyfrowaniu)

 

33 FF 82

 

A serwer odpowiadał

99

 

Co oznaczało poprawne przyjęcie akcji i zaakceptowanie nowej pozycji gracza. Jeżeli chodzi natomiast o moby to one były przesyłane również za pomocą ciągu liczb tyle że tam po odszyfrowaniu każda liczba oznaczała konkretną akcje.

 

UWAGA !!

Serwer i klient nie wymieniały się żadną grafiką w czasie grania, ani nic. Ciągle były to suche informacje przekazywane w liczbach które zawsze coś oznaczały itp. Dlatego łącze było wykorzystane w minimalnym stopniu i za bardzo nie wpływała prędkość neta na rozgrywkę.

 

 

Byłbym zapomniał jak chcesz to pooglądaj sobie kod TFS i YTAC to zobaczysz dokładnie jak to działało

Link do komentarza
Udostępnij na innych stronach

UWAGA !!

Serwer i klient nie wymieniały się żadną grafiką w czasie grania, ani nic. Ciągle były to suche informacje przekazywane w liczbach które zawsze coś oznaczały itp. Dlatego łącze było wykorzystane w minimalnym stopniu i za bardzo nie wpływała prędkość neta na rozgrywkę.

 

Zgadza się. To dlatego tęż pisałem wyżej że klient z serwerem przesyła tylko takie informacje jak położenie postaci, ilość wirtualnej gotówki, itp. Wszystko to opiera się na przesyłaniu liczb i to w dodatku tak jak kolega zauważył zakodowanych. Ale kodowanie jest tu mało istotne, grunt że chodzi tu o przesyłanie tylko i wyłącznie parametrów.

 

Zastanawia mnie jedno czy serwer jest tak jakby "całym mózgiem"?? Czyli czy on jest odpowiedzialny za stronę fizyczną gry, może inaczej czy to serwer zawiera cały silnik fizyczny, a klient jest tylko tak jakby "wyświetlaczem" (tego co się dzieje na serwerze)??

 

Może inaczej, jak zaznaczyłem grałem w Air Rivals w którym to latało się samolotami. No i jak wiadomo jest mapa. I gdy wlecę samolotem w ziemie to on się odbija (wiadomo że tez spada HP). Ale teraz tak: to że samolot się odbił to sprawka silnika fizycznego który jest w kliencie czy silnika fizycznego w serwerze?? Jeżeli taki silnik fizyczny byłby umieszczony na serwerze to logicznie rzecz biorąc obciążało by to strasznie procesor serwera, no bo w końcu z 500 osób było przeważnie online.

 

Posługiwałem się wyżej pojęciem silnik fizyczny, wiem że może troche przesadziłem z tym silnikiem ale chciałem zobrazować sytuacje ;p

Link do komentarza
Udostępnij na innych stronach

@Mam nadzieje że dobrze zrozumiałem :P

 

Silnik o którym mówiłem ja różni się od twojego tym że u Ciebie 1 wciśnięcie klawisza powoduje trwały proces obliczeń na serwerze (czytaj samolot ciągle leci z jakąś prędkością). I tutaj na logike takimi zadaniami musi zajmować się serwer.

 

Tak samo będzie z kolizjami (gracz-gracz, gracz-obiekt, obiekt-obiekt). Tak ważne rzeczy nie mogą być obliczane po stronie klienta. Wystarczyło by aby gracz blokował pakiety odpowiedzialne za "uśmiercanie" jego samolotu i staje się nie śmiertelny. Po za tym co by było gdyby na ekranie dwóch graczy został zestrzelony samolot ?

 

Natomiast klient gdy dostanie info iż z pozycji {x: 212, y:531, z: 1} samolot znalazł się na pozycji {x: 212, y: 531, z: 0} To wiadome jest iż samolot ten doznał kolizji z obiektem (ziemią) i trzeba wyświetlić odpowiednie obrazy do sytuacji. Jednak nie jest to równoznaczne ze śmiercią bo taki pakiet nie nadszedł. Dlatego klient będzie oczekiwał w dalszym ciagu na to co ma zrobić.

 

 

Wbrew pozorom obliczenia te nie są bardzo skomplikowane. Problemem jest ilość użytkowników bo 1 user więcej wcale nie dodaje tyle zadań co poprzedni. Tylko o wiele więcej.

 

Podsumowując mój nie zrozumiały wywód Klient w pewnym sensie ma silnik fizyczny. Lecz on nic nie wysyła serwerowi który to jest ważniejszy od silnika klienta.

 

 

 

Ps. Weź gry stare które są już długo na rynku np CS. Jak myślisz dlaczego gracze mogą widzieć przez sciany ?? Odpowiem za Ciebie iż silnik aktualizując pozycje gracza wysyła je na bierząco do klientów którzy muszą tylko podmienić obiekt ściany na przezroczysty...

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...