Если отрисовывать пакеты сервера сразу после получения, джиттер (неравномерность интервалов между пакетами) целиком виден на экране.
Почему Полученная позиция рисуется сразу, или буфер короче джиттера → Следствие На опоздавших пакетах движение останавливается, на пришедших пачкой скачет вперёд → На экране Другие персонажи двигаются рывками
Основной ответственный Команда разработки · Разработка клиента · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Клиент: завести буфер интерполяции, автоматически подстраивать его длину под состояние подключения. Сервер: применять компенсацию задержки (проверку попадания с отмоткой времени назад), чтобы попадание засчитывалось правильно, даже если игрок стрелял по картинке, отстающей на длину буфера.
Цифры для ориентира
Обычно длину буфера берут примерно равной двум интервалам отправки пакетов сервером (при 20 пакетах в секунду это 100 ms).
На графике
Высоко с самого начала · интервал прихода пакетов, число опустошений буфера интерполяции
Где смотреть
Записывать на клиенте распределение интервалов прихода пакетов сервера и число кадров, когда следующего снапшота для интерполяции не было и движение остановилось или перешло на экстраполяцию
Подтверждает
Разброс интервалов часто превышает длину буфера интерполяции, каждый раз буфер пустеет, и другие персонажи дёргаются. С более длинным буфером это случается реже
Опровергает
Если буфера достаточно, а рывки остаются, проверить, не сбивается ли сам интервал отправки на сервере (запаздывание тиков)
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
Чем длиннее буфер, тем плавнее движение, но тем дальше в прошлом игрок видит противника. Поэтому вместе с буфером используют компенсацию задержки: при проверке попадания сервер отматывает время назад, к «прошлому, которое видел этот игрок».
Physics (Netcode for Entities 6.5)Unity Компенсация задержки: сервер берёт мир коллизий в том состоянии, которое клиент видел на этом тике, и по нему проверяет попадание