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

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

Буфер интерполяции отсутствует или слишком короткий Missing/short interpolation buffer

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

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

Если отрисовывать пакеты сервера сразу после получения, джиттер (неравномерность интервалов между пакетами) целиком виден на экране.

Почему Полученная позиция рисуется сразу, или буфер короче джиттера → Следствие На опоздавших пакетах движение останавливается, на пришедших пачкой скачет вперёд → На экране Другие персонажи двигаются рывками

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

Источники

  1. Interpolation and extrapolation (Netcode for Entities 6.5) Unity
    Интерполяция с буфером: отрисовку намеренно задерживают, чтобы дождаться опоздавших пакетов. Чем больше буфер, тем точнее картинка, но тем больше задержка
  2. Struct ClientTickRate (Netcode for Entities 6.5) Unity
    Буфер интерполяции по умолчанию InterpolationTimeNetTicks = 2 (2 интервала отправки сервера)
  3. Physics (Netcode for Entities 6.5) Unity
    Компенсация задержки: сервер берёт мир коллизий в том состоянии, которое клиент видел на этом тике, и по нему проверяет попадание

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

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

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

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