Я насправді цього не реалізував (тому можуть виникнути проблеми, яких я не відразу бачу), але я подумав, що спробую допомогти.
Ось що ви сказали, що відбувається:
Клієнт А надсилає вхід на T0
Сервер отримує вхід на T1
Усі клієнти отримують зміну на T2
Однак у T2, використовуючи передбачення клієнта, Клієнт А зараз знаходиться на позиції, відповідної T4.
Напевно, було б корисно продумати час сервера. Це (ймовірно) дуже схоже на те, як працює інтерполяція .
Кожна команда надсилається з сервером часу. Цей час сервера з'ясовується на початку матчу шляхом запиту на галочку сервера, компенсуючи час пінгу. У клієнта у вас є власний локальний підрахунок галочок, і кожна команда, яку ви надсилаєте, перетворюється на тикові сервера (це проста операція віднімання)
Також клієнт завжди рендерує "в минулому". Отже, ви припускаєте, що світ, який бачить клієнт, на 100 м відстає від часу сервера.
Тож давайте перефразовуємо ваш приклад із часом сервера (позначеним S).
Клієнт надсилає вхід на T0 із часом сервера S0 (який, мабуть, насправді є "клієнтським представленням часу сервера мінус час інтерполяції"). Клієнт не чекає відповіді від сервера і рухається негайно.
Сервер отримує вхід на T1. Сервер визначає авторитетну позицію клієнта в час сервера S0, заданий клієнтом. Надсилає це клієнту.
Клієнт отримує авторитетну позицію на T2 (все ще з позначенням часу сервера S0). Клієнт відслідковує деякий час, що варто попередніх подій (можливо, це лише черга всіх непідтверджених прогнозів).
Якщо передбачувана позиція / швидкість / те, що сервер надсилає назад у S0, відрізняється від того, що клієнт зберігав у S0, клієнт це якось обробляє. Або відкинувши програвач на попередню позицію, або змінивши попередній вхід, або, можливо, щось інше я не думав.