Pracuję nad silnikiem gry wieloosobowej serwer-klient 2D (który możesz wypróbować tutaj ). Wykorzystuje WebRTC DataChannel
. (Połączenia są peer-to-peer, ale host-host nadal działa jako serwer).
Największym problemem (oprócz łączności) jest lokalna prognoza wejściowa. Robimy to, co zwykle: po naciśnięciu klawisza gracze poruszają się natychmiast, mówią gospodarzowi, jakie klawisze są naciskane, odbierają dane z hosta i porównują je z historyczną pozycją. Pozycja jest korygowana w czasie, jeśli występuje różnica. Działa to dobrze przy niskiej utracie pakietów lub PDV , nawet jeśli ping jest wysoki.
Jeśli występuje strata lub PDV, odchylenie może być większe. Myślę, że dzieje się tak, ponieważ jeśli pierwszy pakiet wskazujący zmianę danych wejściowych jest opóźniony lub upuszczony, host dowiaduje się później i zaczyna zmieniać tego odtwarzacza później, niż pokazuje lokalny przewidywanie wejściowe.
Jeśli gracz się porusza, zwiększamy zastosowaną korekcję, ponieważ jest ona mniej zauważalna. Wydaje się, że to zasłania luki, gdy zaczynasz się poruszać i podczas ruchu. Jednak każda korekta jest bardziej zauważalna, jeśli nagle się zatrzymają. Następnie, jeśli PDV lub utrata oznacza, że gospodarz myśli, że zatrzymał się później, gospodarz przeskakuje, przesyła dane z informacją, że są nieco dalej, a korekta sprawia, że gracz trochę dryfuje. Na niestabilnych połączeniach gracze często zauważalnie dryfują po zatrzymaniu.
Nie zauważyłem tego w innych grach. Jak można to złagodzić?