Игра предсказывает ввод соперника и показывает результат заранее, а при ошибке отматывает назад и пересчитывает. Чем больше пинг, тем глубже отмотка.
Почему Соперник сменил ввод (не так, как предсказано) → Следствие Реальный ввод приходит с опозданием на половину пинга, и на столько же приходится отматывать назад и пересчитывать → На экране Движение соперника проскакивает несколько кадров или внезапно меняется
Основной ответственный Команда разработки · Разработка клиента
Команда разработки: задачи
Добавить задержку применения ввода (input delay) в 1–3 кадра, чтобы уменьшить глубину отмотки, ограничить глубину отмотки.
Цифры для ориентира
При пинге 100 ms (50 ms в одну сторону) и 60 fps отматывается около 3 кадров. Если задержать применение ввода на 2 кадра, отмотка сократится до 1 кадра.
На графике
Случайные всплески · число отмотанных кадров, RTT (пинг)
Где смотреть
Записывать на клиенте при каждой отмотке число отмотанных кадров, RTT в этот момент, настройку задержки применения ввода и время, ушедшее на отмотку и пересчёт
Подтверждает
В моменты, когда движение соперника дёрнулось, число отмотанных кадров большое, средняя глубина отмотки примерно равна (задержка в одну сторону − задержка применения ввода) ÷ время кадра и растёт с пингом
Опровергает
Если отмотка небольшая, а микрофризы есть, это проблема производительности: пересчёт не укладывается в один кадр. Если и после отмотки результаты на двух экранах расходятся, это рассинхронизация (desync)
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Источники
GGPO Rollback Networking SDKGGPO Ввод соперника предсказывается, игра идёт вперёд, а если реальный ввод другой, всё пересчитывается от момента расхождения до текущего