Если сервер отправляет «только то, что изменилось с прошлого раза», то при потере первой полной посылки (опорного снапшота) последующие изменения применить невозможно.
Почему Пакет с полными данными объекта (опорный снапшот) теряется или отбрасывается до обработки → Следствие Клиенту не к чему применять последующие изменения, и он их игнорирует → На экране Объект не виден или внезапно появляется спустя долгое время
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: обязательно повторять отправку опорного снапшота, пока не придёт подтверждение (ACK), формировать изменения только относительно опорного снапшота, получение которого клиент подтвердил. Клиент: отправлять подтверждение (ACK) опорного снапшота только после его фактического применения, при получении изменений для неизвестного объекта запрашивать у сервера данные заново.
На графике
Случайные всплески · число полученных изменений для неизвестных объектов
Где смотреть
Сопоставить число отброшенных клиентом изменений без опорного снапшота и ID объектов со временем, когда сервер отправил опорный снапшот этого объекта и когда получил ACK. Воспроизвести в среде разработки, добавив потери (loss в tc netem, доля потерь пакетов в эмуляции сети Unreal)
Подтверждает
Для невидимого объекта сервер отправил опорный снапшот, ACK не получил, но продолжал слать только изменения, а клиент эти изменения отбрасывал
Опровергает
Если опорный снапшот подтверждён ACK и применён на клиенте, а объекта всё равно не видно, причина в потере уведомления об исчезновении или путанице из-за повторного использования ID объектов
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Источники
Snapshot CompressionGaffer On Games Изменения нужно формировать только относительно опорного состояния (baseline), получение которого подтвердила другая сторона (ack), а начальное состояние отправлять отдельно
Quake III Arena source: code/server/sv_snapshot.cid Software Дельта-сжатие выполняется относительно снапшота, подтверждённого клиентом, а если опорный снапшот слишком старый, отправляется полный снапшот
tc-netem(8) — Linux manual pageiproute2 Инструмент для тестирования, который добавляет к исходящим пакетам задержку и джиттер (delay TIME JITTER) и потери (loss random PERCENT), имитируя реальную сеть
Using Network Emulation in Unreal EngineEpic Games Тестирование с минимальной и максимальной задержкой и долей потерь пакетов на сервере и клиенте, в консоли задаётся, например, как NetEmulation.PktLag