Czy wykrywanie kolizji powinno odbywać się po stronie serwera czy kooperacyjnie między klientem / serwerem?

24

Pracuję nad grą online, która będzie miała bardzo intensywne przetwarzanie wykrywania kolizji. Modele graczy będą kolidowały z innymi odtwarzaczami, mobami, strukturami, terenem i obiektami stałymi, które istnieją tylko po stronie serwera (nie są przechowywane w plikach danych klienta).

Czy ze względów bezpieczeństwa należy wykonywać wszystkie wykrywanie kolizji po stronie serwera? A może powinienem zlecić klientowi wykrycie i serwer powinien jakoś to sprawdzić? Wydaje mi się, że będzie to zbyt wiele dla samego serwera (projektuję silnik dla setek graczy na jednym serwerze).

Czy ktoś wie, jak to robią główne MMO? Wiem, że prawie wszystkie MMO są obecnie podatne na ataki fizyków i zwykle radzą sobie z nimi poprzez wykrywanie ataków i banowanie ludzi. Wolałbym, żeby hacki w ogóle nie działały, przynajmniej dla elementu fizyki.

BarakatX2
źródło

Odpowiedzi:

21

Wydaje się, że oczywistą odpowiedzią jest wykonanie większości detekcji po stronie klienta (dla płynności), a następnie interpolacja do tego, co mówi serwer, jeśli twój klient jest zbyt daleko. Serwer będzie zaznaczał rzadziej niż klient (np. 10 Hz) i prawdopodobnie potrzebowałby podstawowego kodu „czy ten gracz dotarł tam, gdzie twierdzi, że obecnie pochodzi ze swojej ostatniej znanej lokalizacji”, co oznacza pewnego rodzaju rozwiązanie typu nav nav i wyszukiwanie ścieżek.

To może być zbyt powolne, w zależności od twoich potrzeb. Możesz na przykład podjąć decyzję projektową, aby nie przejmować się kolizją gracz-gracz na serwerze. O ile wiem, większość gier nawet nie przejmuje się tym na kliencie. To zależy od twoich potrzeb.

Ale ogólna zasada jest taka, że ​​nigdy nie należy ufać klientowi. Jeśli wpływa to na rozgrywkę, musisz przynajmniej zweryfikować ją na serwerze.

Tetrad
źródło
24

Oto kilka odpowiedzi tutaj.

  • Kolizja po stronie klienta jest idealna z punktu widzenia wydajności i punktu widzenia gracza. Nie chcesz, aby kolizja była opóźniona, chcesz, aby gracze wpadli na solidny obiekt i przestali. Jeśli robisz to po stronie serwera, albo patrzysz na graczy z gumką w każdym miejscu, albo dajesz graczom zauważalne opóźnienie, gdy próbują się poruszyć. Złe mojo, w obu przypadkach.

  • Kolizja po stronie serwera jest idealna z punktu widzenia bezpieczeństwa. Im bardziej klienci zbliżają się do „głupich terminali”, tym gra jest mniej użyteczna. Jest powód, dla którego nikt nie grając w tekstowy MUD, nie musi się martwić o hacki ścienne lub speedhacki - to dlatego, że klient nie robi nic wartego wzmianki.

  • Wykonanie obu jest „idealne” w prawie każdym przypadku. Pozwól klientom robić swoje, a następnie dwukrotnie sprawdź serwer, aby upewnić się, że ludzie nie oszukują. Wady to złożoność, synchronizacja (co dokładnie robisz , jeśli się nie zgadzają) i samo użycie procesora przez serwer.

  • To, co zalecam, to zrobić prawie w całości po stronie klienta. Klient jest autorytatywny w stosunku do swojej pozycji, podobnie jak w pełnym systemie po stronie klienta, i wykonuje wszystkie własne operacje przetwarzania. Ponadto losowo serwer od czasu do czasu sprawdza różnych graczy. Utrzymuj obciążenie serwera na niskim poziomie, ale zaskakująco szybko wykończy oszustów.

Alternatywnie, zrób to teraz po stronie klienta, dodaj weryfikację po stronie serwera w pewnym momencie w przyszłości, jeśli twoja gra stanie się na tyle popularna, że ​​ludzie ją oszukują. Co, bądźmy szczerzy, prawdopodobnie nie będzie, więc nie ma sensu poświęcać na to teraz czasu programistom.

ZorbaTHut
źródło
3

World of Warcraft nie wykrywa kolizji między graczami / mobami. Przyczyną tej decyzji mogą być, ale nie muszą, powody techniczne, ale tak naprawdę musi to być raczej decyzja dotycząca projektu gry niż decyzja techniczna:

Wyobraź sobie, jak może być wykorzystany w sytuacjach gracz-przeciw-gracz. Lub jak trudno byłoby korzystać z banku / domu aukcyjnego / skrzynek pocztowych, jeśli inni (często bezczynni) gracze blokują Twój ruch!

Jeśli chodzi o wykrywanie kolizji między klientem a serwerem - tak naprawdę, chyba że ruch jest bardzo wolny, musi być przede wszystkim po stronie klienta, więc wygląda dobrze dla każdego klienta. Opóźniona / opóźniona reakcja na zderzenie i / lub zderzenie z „niewidzialnymi” obiektami byłoby dość nieprzyjemne.

bluescrn
źródło
1
Chociaż pytanie nie dotyczy tego, czy kolizja między graczem a mobem / graczem jest złym projektem, sugerowałbym spojrzenie na gry takie jak Darkfall Online, w których wszystko jest solidne. Dodaje nowy wymiar rozgrywce i pozwala robić bardzo interesujące rzeczy z grą. Nie martwiłbym się, że gracze blokują w mojej grze takie rzeczy, jak banki, ponieważ zawsze będzie mała szczelina, w której gracze będą mogli przejrzeć, aby otworzyć obiekt.
BarakatX2
Gracze mogą być blokowani przez wszystko, co może zaatakować, a wszystko, czego nie mogą zaatakować, może po prostu przejść. Na przykład gracze nie będą mogli przechodzić przez moby, ponieważ mogą atakować moby. Nie byliby również w stanie przechodzić przez graczy, gdy są oznaczeni jako PVP, ponieważ są oznaczeni jako PVP. Gracz, który nie jest oflagowany PVP, może przejść przez dowolnego gracza, nawet takiego, który nie jest oflagowany PVP, ponieważ nie może zaatakować tych graczy.
Azaral
2

Jeśli obawiasz się włamań i ma to duży wpływ na grę, odpowiedź brzmi TAK.

W mojej grze opartej na przeglądarce, która jest grą typu „budowanie miasta”, nie przejmuję się hackami, ponieważ silnik kliencki nie zawiedzie, gdy układam zapisany stan gry.

Może to jednak potencjalnie nadużywać rozgrywki, ponieważ gracz musi wydać monety (lub gotówkę premium), aby powiększyć obszar gry w celu zbudowania większej liczby domów / budynków. Zamierzam więc wdrożyć prostą kontrolę liczby płytek zajmowanych przez nowo dodane budynki, ile wolnych płytek jest dostępnych.

Twórca gry Noob
źródło