한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L1 Процесс игрового клиента

Расхождение клиентского предсказания с сервером Prediction mismatch / reconciliation

ID причины cg-predict · Основной ответственный Команда разработки · Разработка клиента · Совместно Команда разработки · Разработка сервера

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Клиент заранее показал движение персонажа игрока, но сервер посчитал иначе, и персонажа утягивает на серверную позицию.

Почему Клиент двигает персонажа до подтверждения сервера (предсказание) → Следствие Сервер по-другому считает коллизии, скорость движения или баффы либо не получает команду → На экране Когда приходит подтверждение, персонажа откидывает назад

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

Источники

  1. Introduction to prediction (Netcode for Entities 6.5) Unity
    Клиент и сервер предсказывают одним и тем же кодом симуляции. Если состояние расходится с серверным (ошибка предсказания), клиент возвращается назад и пересчитывает, и коррекция становится видна
  2. Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
    На случай потери пакетов вместе с последним вводом повторно отправляется ввод нескольких предыдущих тиков
  3. Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
    Клиент двигается первым, сервер воспроизводит то же движение. Если позиции расходятся, сервер присылает коррекцию через ClientAdjustPosition, и клиент заново применяет сохранённые движения

Смотрите также

Тот же слой: L1 Процесс игрового клиента

Причины с тем же симптомом (Откидывание назад) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами