Jak zsynchronizować klienta i serwer podczas wysyłania zmian prędkości odtwarzacza?

10

Wdrażam przewidywanie po stronie klienta. Większość wyjaśnień zakłada, że ​​klient wysyła wiadomości typu „ Przenieś mojego gracza o 1 pozycję w górę ”. Co jeśli wyślę wiadomość typu „ Ustaw prędkość mojego odtwarzacza na x ”?

grafika objaśniająca;  wyświetlanie wysłanych wiadomości i obliczonych pozycji na kliencie i serwerze w czasie

Na kliencie gracz ustawia własną prędkość (na podstawie przewidywań po stronie klienta), zanim zrobi to serwer, co spowoduje, że obydwie nie będą zsynchronizowane. Ten problem utrzymuje się, nawet biorąc pod uwagę średnie opóźnienie.

Jak sobie z tym poradzić?

Blu3
źródło

Odpowiedzi:

8

Powinieneś wysłać zbędne dane, co tutaj oznacza wysłanie pozycji i prędkości. Nawet jeśli nie jesteś zsynchronizowany, fakt posiadania pozycji i prędkości pozwala skorygować trajektorię za pomocą funkcji interpolacji.

Następnie użycie niektórych sztuczek, takich jak opóźnione animacje, przyspieszenia itp., Pozwala ukryć opóźnienie.

Edycja: Zakładam, że serwer jest autorytatywny.

Thelvyn
źródło
Dzięki za odpowiedź. Tak, serwer jest autorytatywny, ale nawet jeśli wysyłam nadmiarowe dane z moją szybkością, klient może poprawić swoje błędy, ale często czytam takie rzeczy, jak: „Jeśli klient / serwer używa wspólnego kodu dla swoich podmiotów, błędy prognozowania nigdy tak naprawdę nie wystąpią”, ale w moim przypadku ZAWSZE wystąpią nieznacznie, co spowodowałoby jąkanie się.
Blu3
1
@ user13842 klient zawsze się nie synchronizuje, powinieneś poprawić pozycję i prędkość po stronie klienta, jak powiedział Thelvyn, zgodnie z tym, co serwer wysyła. w ten sposób nie dostajesz ruchu jąkania, chyba że twój klient jest całkowicie niezsynchronizowany, wtedy będziesz musiał uchwycić wartości, ponieważ korekta zajęłaby zbyt dużo czasu.
dreta
Jest to główny powód korzystania z funkcji interpolacji. Nie możesz uniknąć opóźnień, więc musisz płynnie korygować ruch. Klient i serwer symulują świat, ale klient musi nasłuchiwać serwera i dokonywać poprawek. Niektóre techniki stosowane w sieci Source Engine: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn
jest również krótko wspomniany w tym Google Talk, powinien uzyskać pomysł na youtube.com/watch?v=Prkyd5n0P7k#t=18m47s
dreta
Znalazłem inne rozwiązanie tego konkretnego problemu. Dodaję czas, w którym klient zastosował swoje dane wejściowe do każdego pakietu. Znaczenie nr 1 miałoby czas: 0 i drugi raz: 100. Teraz serwer wie, że klient nacisnął przycisk w tym samym czasie: 100, a nie wcześniej.
Blu3