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

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

Ожидание самого медленного игрока в lockstep Lockstep waits for the slowest peer

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

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

В схеме, где все вместе рассчитывают один и тот же ход, при опоздании ввода одного игрока ждут все.

Почему Каждый ход можно рассчитать, только собрав ввод всех игроков → Следствие Ввод одного игрока приходит поздно из-за джиттера или потерь → На экране У всех одновременно замирание, в тяжёлых случаях окно «Ожидание игрока»

Симптомы
Фриз, Микрофризы, Задержка ввода
Факторы
Джиттер, Потери, Остановка
У кого
Одна локация или канал
Когда
Изредка, случайно
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: автоматически подстраивать задержку применения ввода под пинг, ненадолго исключать только опаздывающего игрока, чтобы остальные продолжали без ожидания. Клиент: соблюдать заданную задержку применения ввода; в P2P без промежуточного сервера подстройку этой задержки и обработку опаздывающих тоже берёт на себя клиент-хост.
Цифры для ориентира
Если задержку применения ввода (input delay) сделать меньше, чем «время доставки ввода сопернику + джиттер», фризы станут частыми. Время доставки при прямом обмене равно половине пинга, а через промежуточный сервер примерно половине суммы пингов двух игроков.
На графике
Случайные всплески · время ожидания хода, задержка прихода ввода по игрокам
Где смотреть
Записывать для каждого хода время прихода ввода от каждого игрока и время, которое ход простоял в ожидании, и смотреть, чьего ввода ждал остановившийся ход. Если есть промежуточный сервер, это видно и по интервалам прихода пакетов ввода от каждого игрока в захвате пакетов на сервере
Подтверждает
В каждом остановившемся ходе ввод одного и того же игрока пришёл позже, чем позволяет задержка применения ввода, и в это время у него подскакивают джиттер и потери
Опровергает
Если весь ввод пришёл вовремя, а игра всё равно стоит, проблема во времени расчёта на самом медленном ПК или в обработке на сервере. Если фризов нет, а расходятся только результаты на двух экранах, это рассинхронизация результатов расчёта (desync), и нужно смотреть расхождение расчёта пути при синхронизации команд
Чем проверить
Нужны логи и метрики игрового сервера или клиента

Источники

  1. Deterministic Lockstep Gaffer On Games
    Кадр n можно рассчитать, только когда пришёл весь ввод, поэтому при опоздании игра ждёт. Если буфер задержки воспроизведения, поглощающий джиттер, мал, бывают замирания
  2. 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond Game Developer
    Команды планируются на исполнение через два хода, а длина хода подстраивается под самый медленный компьютер и пинг (Speed Control)
  3. A Survey and Taxonomy of Latency Compensation Techniques for Network Computer Games (ACM Computing Surveys, 2022) ACM
    Задержка применения ввода (incoming delay) выставляется равной задержке «A→сервер + сервер→B», чтобы все применяли ввод в один и тот же момент

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

Тот же слой: Архитектура синхронизации

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

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