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.