Jak zsynchronizować działania takie jak skok w trybie dla wielu graczy?


11

Jestem deweloperem gier dla początkujących i badam gry wieloosobowe. Zauważyłem, że zawsze występuje pewne opóźnienie, gracze zawsze otrzymują aktualizacje z poprzednich działań. Ale istnieją techniki takie jak liczenie martwych, aby poradzić sobie z opóźnieniem. Potrafię przewidzieć ruch i sprawić, by ruchy były płynne. Ale w jaki sposób synchronizowałbym działania, takie jak skakanie, zatrzymywanie się itp.

Załóżmy, że klient A poruszał się, był na 100 m przy 10,2 czasie z prędkością 100 m / s i wysłał tę informację. Klient B otrzyma tę informację nieco później, niech będzie to 10.4. Więc na kliencie B mogę użyć predykcji i ustawić klienta A na 120m. Ale co, jeśli klient wykonał skok na 110 m na 10,3. Nie mogę tego przewidzieć, a ponieważ korzystam z przewidywania, nie mogę pokazać klientowi skoku w przeszłości.

Mogę poradzić sobie z tym problemem, nie wysyłając w ogóle akcji skoku. Ale co, jeśli moja gra ma puste przestrzenie, w których gracze mogą upaść i umrzeć. Tak więc, jeśli nie zsynchronizuję akcji skoku, inni gracze zauważą, że jeden z graczy biegnie, a następnie wpada w pustkę, a następnie ponownie pojawia się na ekranie, niszcząc wizualne zaangażowanie.

Skok jest tylko przykładem, może istnieć wiele scenariuszy, w których przewidywanie nie może działać. Jak sobie z nimi poradzić. Jednym z takich przykładów mogą być wieloosobowe gry bitewne online, takie jak Awesomenauts.


Nie wiem dużo o trybie wieloosobowym, więc nie będę w stanie udzielić właściwej odpowiedzi. Ale z tego, co wybrałem, idealna konfiguracja polegałaby na tym, że Twoi klienci byliby mniej lub bardziej głupi i wysyłali tylko klawiaturę, mysz, gamepad lub cokolwiek innego do serwera, a serwer wykonuje cały ruch i aktualizuje świat i wysyła pozycje i wszystkie inne istotne dane z powrotem do klientów, które następnie wyświetlają wynik. To wszystko eliminuje prognozy i podobne rzeczy.
Christian

@Christian hej! Dziękuję za odpowiedź. Wiem o tym podejściu, ale może to spowodować szarpnięcie gry, jeśli opóźnienia są duże, a ponadto korzystam z systemu BaaS AppWarp w czasie rzeczywistym, więc cała moja logika leży po stronie klienta.
Suyash Mohan

Łączenie obu metod jest autorytatywnym serwerem. Klienci i serwer symulują, klienci wysyłają dane wejściowe, serwer odsyła stan autorytatywny. Klienci dostosowują swój stan do stanu autorytatywnego. Kiedy więc stany się zgadzają, klienci działają tak, jakby byli symulowani lokalnie (bez opóźnień).
MichaelHouse

Niedawno znalazłem tę serię samouczków, która daje dobre wskazówki na temat zarządzania opóźnieniami, wydaje się, że byłaby odpowiednia dla twoich zainteresowań: link
Kris Welsh

Odpowiedzi:


8

Martwe liczenie może nie być najlepszym pomysłem w tym przypadku; powinieneś wykonać interpolację bytu (skutecznie renderując innych graczy w przeszłości, co zawsze daje ci prawdziwe, prawidłowe pozycje). Pisałem o tym ze znacznie bardziej szczegółowymi informacjami tutaj . To, czy widzimy graczy w przeszłości, jest akceptowalne, czy nie, zależy od szczegółów tego, co próbujesz zrobić.


4
Wykorzystałem to podejście, pisząc swoją pierwszą grę sieciową dla wielu graczy. W rzeczywistości użyłem @ ggambett's jako odniesienia. To działało dla mnie dobrze.
NoobsArePeople2

1

Istnieje dość szczegółowy opis dotyczący silnika źródłowego. Wygląda na to, że część odpowiedniego kodu źródłowego jest również dostępna jako część źródłowego zestawu SDK.

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Wykorzystuje szereg technik, aby spróbować poradzić sobie z opóźnieniami sieci w modelu serwer-klient. Wydaje się, że główny punkt polega na tym, że lokalny klient lokalnie obsługuje wejściowe i inne zdarzenia tak, jakby nie było serwera, a następnie zajmuje się możliwością, że serwer twierdzi, że później klient popełnił błąd.

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.