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.
źródło
Odpowiedzi:
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ć.
źródło
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.
źródło