Nie zaimplementowałem tego (więc mogą pojawić się problemy, których nie widzę od razu), ale pomyślałem, że spróbuję pomóc.
Oto, co się wydarzyło:
Klient A wysyła dane wejściowe w T0
Serwer otrzymuje dane wejściowe w T1
Wszyscy klienci otrzymują zmianę w T2
Jednak w T2, używając prognozy klienta, klient A jest teraz w pozycji odpowiedniej dla T4.
Prawdopodobnie przydałoby się myśleć o czasie serwera. Jest (prawdopodobnie) bardzo podobny do działania interpolacji .
Każde polecenie jest wysyłane z czasem serwera. Ten czas serwera jest ustalany na początku meczu, sprawdzając tik serwera, kompensując czas pingowania. Na kliencie masz własną lokalną liczbę tików, a każde wysyłane polecenie jest konwertowane na tiki serwera (jest to prosta operacja odejmowania)
Ponadto klient zawsze renderuje „w przeszłości”. Zakładasz więc, że świat, który widzi klient, jest, powiedzmy, o 100 ms krótszy niż rzeczywisty czas serwera.
Przeformułujmy więc twój przykład z czasem serwera (oznaczonym przez S).
Klient wysyła dane wejściowe w czasie T0 z czasem serwera S0 (domyślam się, że tak naprawdę „reprezentacja czasu serwera przez klienta minus czas interpolacji”). Klient nie czeka na odpowiedź z serwera i natychmiast się przenosi.
Serwer otrzymuje dane wejściowe w T1. Serwer ustala wiarygodną pozycję klienta w czasie serwera S0 podaną przez klienta. Wysyła to do klienta.
Klient otrzymuje autorytatywną pozycję w T2 (nadal z wyznaczeniem czasu serwera S0). Klient śledzi przeszłe zdarzenia z przeszłości (prawdopodobnie tylko kolejkę wszystkich niepotwierdzonych prognoz).
Jeśli przewidywana pozycja / prędkość / cokolwiek, co serwer odsyła w S0, jest inne niż to, co klient zapisał w S0, klient jakoś sobie z tym poradzi. Albo przez przywrócenie odtwarzacza do poprzedniej pozycji, albo na powrót do poprzedniej informacji, albo może coś innego, o czym nie myślałem.