Obecnie w mojej grze klient jest jedynie rendererem. Gdy stan wejściowy zostanie zmieniony, klient wysyła pakiet do serwera i przesuwa odtwarzacz tak, jakby przetwarzał dane wejściowe, ale serwer ma ostatnie słowo na temat pozycji.
To ogólnie działa bardzo dobrze, z wyjątkiem jednego dużego problemu: spadania krawędzi. Zasadniczo, jeśli gracz idzie w kierunku krawędzi, powiedz na klifie, i zatrzymuje się tuż przed zejściem z krawędzi, czasem sekundę później, zostanie teleportowany z krawędzi. Wynika to z faktu, że pakiet „Przestałem naciskać W” jest wysyłany po przetworzeniu informacji przez serwer.
Oto schemat opóźnień, który pomoże Ci zrozumieć, co mam na myśli: http://i.imgur.com/Prr8K.png
Mógłbym po prostu wysłać pakiet „W Pressed” do każdej ramki do przetworzenia przez serwer, ale wydaje się to rozwiązaniem kosztownym dla przepustowości.
Każda pomoc jest mile widziana!
źródło
Rozumiem twoje pytanie jako:
Serwer dostaje pakiet, gdy zaczynam naciskać przycisk „do przodu”, a inny pakiet, kiedy w końcu puszczam przycisk „do przodu”. Dlatego rzeczywisty ruch na serwerze rozpoczyna się i kończy około 100 milisekund „za późno” w rzeczywistej grze w porównaniu z tym, co gracz wyraża po stronie klienta. Więc jeśli gracz chce przesunąć się o 10 sekund, może skończyć się ruchem 10x sekund zamiast tego w
x >= 1
trybie online.Jest to zła strategia projektowania, ponieważ nie wyraża woli gracza w świecie gry, tak jak chce, co powoduje raczej słabe wrażenia użytkownika.
Rozwiązaniem, które polecam, jest wysyłanie pakietu (tak często, jak to możliwe), który wskazuje, ile kroków gracz zrobił i w jakim kierunku. Serwer następnie aktualizuje świat gry o nową lokalizację gracza, jeśli przejdzie kontrolę poprawności. Dzięki temu gracz może poruszać się z dużą precyzją i unikać spadania z wysokich półek.
Alternatywą byłoby zapamiętanie pozycji gracza w ostatniej sekundzie i skorygowanie pozycji z perspektywy czasu zwolnienia przycisku. Wygląda na to, że tworzyłby ten efekt gumki z dawnych czasów. (Tylko z innego powodu)
Zasadniczo musisz wysłać pakiet, który przycisk został wciśnięty i jaki był faktyczny czas gry, który został naciśnięty, a następnie, który przycisk został zwolniony i o której godzinie.
źródło