Jak zbudować prosty serwer gier dla gry wieloosobowej?


9

Chciałbym stworzyć prosty serwer do gry wieloosobowej dla prostej gry:

Gra ma być podobna do Command & Conquer, masz kilka czołgów i kilku żołnierzy. Możesz wybrać jednego żołnierza, a następnie kliknąć mapę, do której żołnierz powinien się udać. Jeśli żołnierz dotrze do miejsca, do którego nie mógł pójść, chodzi po okolicy. A żołnierze mogą zostać zestrzeleni przez wrogów.

Jak powinienem ustrukturyzować serwer gier i co należy zrobić u klienta?

To znaczy, jeśli żołnierz przesunie się z X na Y, ale wokół budynku Z, sądzę, że serwer musi być w stanie dokładnie obliczyć lokalizację żołnierza (na wypadek, gdyby strzelił do niego wróg), a klient musi również znać pozycję malowanie żołnierza.

Co należy zrobić na serwerze i myślę, że muszę zaprojektować w tym celu protokół. Myślę, że serwer musi śledzić stan gry i czas. Czy ktoś ma sugestie, jak to zrobić? lub może polecić lekturę?

Odpowiedzi:


12

Ogólnie jest to bardzo złożony temat. Masz dwa sprzeczne cele (przynajmniej jeśli nie planujesz uruchamiania każdej gry na dedykowanym serwerze):

  1. Będziesz chciał jak najwięcej zrobić na serwerze, zarówno w celu zapobiegania oszustwom, jak i upewnienia się, że wszyscy klienci zobaczą to samo.
  2. Ale chcesz również, aby wszystko było sprawiedliwe, co oznacza, że ​​jeśli jedna osoba ma ping do serwera 0 razy, podczas gdy inne mają opóźnienie sieci, gdy obie wydają polecenie jednostkom w tym samym czasie, gracz „serwerowy” ma przewagę .

Nie mogę dokładnie powiedzieć, jak rozwiązać ten problem dla RTS. To, co robimy dla naszego wystrzeliwania FPS, polega na tym, że serwer zapisuje pełny stan świata jakiś czas temu i pozwala klientowi na oznaczenie czasu każdym strzałem. Gdy komunikat sieciowy dla „I fired!” dociera do serwera, serwer może cofnąć świat i wykonać testy kolizji itp. na świecie „jak szukał klienta, gdy oddano strzał”.

Jeśli planujesz mieć wiele jednostek, będziesz mieć problem z potencjalnie zbyt dużym przetwarzaniem, aby serwer mógł sobie z tym poradzić. Jeśli nie martwisz się o hakowanie lub oszukiwanie, sugeruję poszukiwanie ścieżek na klientach i wysyłanie ich wyników na serwer.

Jeszcze inną opcją może być skorzystanie z peer2peer, pozwalając każdemu klientowi poradzić sobie z aktualizacjami dla lokalnych zespołów, ale to otwiera pytanie, jak ustalić, kto trafi co i tak dalej.

W zależności od tego, jak skomplikowany jest ten projekt i ile wysiłku chcesz na niego poświęcić, moją najlepszą sugestią byłoby zdecydować się na coś wstępnego i rozpocząć pracę nad jego testowaniem.


1
W rzeczywistości istnieją trzy (a może więcej) sprzeczne cele. Trzeci to wydajność, utrzymywanie i aktualizowanie stanu gry w czasie rzeczywistym w pełni na serwerze, zużywa wiele zasobów.
Bart van Heukelom,

2
Aha, i możesz łatwo rozwiązać # 2, wprowadzając sztuczne opóźnienie, które jest równe średniej opóźnienia innych graczy. Cóż, jeśli możesz nazwać „czyniąc to złym dla wszystkich” rozwiązaniem, to znaczy.
Bart van Heukelom,

@Bart: częściowo prawda, ale oczywiście powinno istnieć ograniczenie dotyczące sztucznie wprowadzanego opóźnienia, lub wolniejsze połączenia mogą stale wymuszać zbyt szybkie opóźnianie połączeń, co jest teraz zdecydowanie tym, czego chcesz.
o0 ”.

Znalezienie najlepszej ścieżki nie stanowi problemu, jeśli zostanie wykonane na kliencie, pod warunkiem, że po znalezieniu przesyła rozwiązanie do serwera, który - jak przy każdym ruchu - sprawdza, czy jest poprawny.
o0 ”.

2

Istnieją w zasadzie dwa podejścia:

  1. Zaufany klient
  2. Niezaufany klient

Zaufany klient jest nieco bardziej złożony, ale ma tę zaletę, że można odciążyć wiele obliczeń z serwera. Koszt działania serwera jest jednym z największych problemów w grach wieloosobowych i poważnie zmniejszy twoją skalowalność.

Dobrym podejściem (dla początkujących) jest umożliwienie każdemu klientowi obsługi własnych jednostek. W następnym kroku możesz użyć zapasowych cykli, aby umożliwić klientom sprawdzenie działań innych klientów. Serwer nie powinien robić więcej niż wymiana wiadomości, synchronizacja i zapewnienie trwałości (np. Baza danych).

Jeśli planujesz mieć jakieś lobby lub czat, poradzisz sobie z każdym z tych tematów na dodatkowym serwerze. Ułatwi to znacznie na drodze.


Dzięki, to było pouczające. Myślę, że wybiorę niezaufanych klientów i muszę wykonać pracę na serwerze. Na początku nie będę miał wielu graczy.
Jonas

1
„Nie będę mieć wielu graczy ...” Nie mogę policzyć liczby programistów, którzy dają mi tę linię i wracają sześć tygodni później z: „Mam tych 5000 graczy, którzy chcą zapłacić za grę, ale nie mogę skalować :( ". Pamiętaj o tym!
Andreas

9
„Zaufany klient” nie jest podejściem, jest błędem.
o0 ”.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.