Клиент заранее показал движение персонажа игрока, но сервер посчитал иначе, и персонажа утягивает на серверную позицию.
Почему Клиент двигает персонажа до подтверждения сервера (предсказание) → Следствие Сервер по-другому считает коллизии, скорость движения или баффы либо не получает команду → На экране Когда приходит подтверждение, персонажа откидывает назад
Основной ответственный Команда разработки · Разработка клиента · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Клиент: использовать тот же код движения, что и на сервере, отправлять ввод с дублированием, сглаживать коррекцию. Сервер: использовать тот же код движения, что и на клиенте, отсеивать дубли ввода по номеру и обрабатывать каждый ввод один раз.
Цифры для ориентира
Расстояние, на которое откидывает персонажа: «время расхождения × скорость движения». Потеря всего нескольких команд даёт 1–3 m.
На графике
Случайные всплески · число серверных коррекций (ошибок предсказания)
Где смотреть
Записывать число коррекций позиции, отправленных сервером, и расстояние коррекции. В Unreal считать коррекции ClientAdjustPosition от сервера, в Unity Netcode for Entities считать, сколько раз из-за ошибки предсказания состояние возвращалось назад и пересчитывалось
Подтверждает
Коррекции скапливаются в моменты жалоб на откидывание назад, а с определёнными баффами, на определённых участках ландшафта или при умениях перемещения коррекция раз за разом получается большой
Опровергает
Если коррекции скапливаются только при больших потерях, дело в потере пакетов ввода (подключение). Если коррекций нет, а утягивает только других персонажей, это «Чрезмерная экстраполяция (dead reckoning)»
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Источники
Introduction to prediction (Netcode for Entities 6.5)Unity Клиент и сервер предсказывают одним и тем же кодом симуляции. Если состояние расходится с серверным (ошибка предсказания), клиент возвращается назад и пересчитывает, и коррекция становится видна