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