В момент входа в зону сервер разом отправляет данные о появлении десятков и сотен окружающих объектов. Если отправлять их по ненадёжному каналу доставки (unreliable) или если буфер приёма переполнится, пока клиент занят загрузкой и не читает сокет, часть данных пропадает и повторно не приходит.
Почему Сразу после входа данные о появлении приходят плотной пачкой за короткое время → Следствие Клиент во время загрузки поздно читает сокет, и буфер приёма ОС переполняется, или большой UDP-пакет фрагментируется, и при потере одного фрагмента пропадает целиком. По ненадёжному каналу доставки повторной отправки нет → На экране Только в клиенте с медленной загрузкой не хватает нескольких NPC. Если выйти из зоны видимости и вернуться, они видны
Сразу после входа или техработ, В движении и при смене локации
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: уведомления о появлении и исчезновении отправлять только по надёжному каналу с гарантированной повторной передачей, начальные данные отправлять частями. Клиент: принимать данные в отдельном от загрузки потоке, увеличить буфер приёма.
Цифры для ориентира
Стандартный размер буфера приёма UDP на ПК зависит от ОС, но обычно составляет от десятков до сотен KB. Если данных о входе в людный город больше, буфер переполняется, даже если загрузка лишь ненадолго мешает читать сокет.
На графике
Всплеск сразу после входа или техработ · объём приёма сразу после входа, число пропущенных уведомлений о появлении
Где смотреть
Сравнить число уведомлений о появлении, отправленных сервером сразу после входа, с числом полученных клиентом и посмотреть, по какому каналу (надёжному или ненадёжному) они шли. В захвате пакетов на стороне сервера смотреть объём, ушедший этому игроку сразу после входа, и фрагментированные пакеты (фильтр Wireshark ip.flags.mf == 1 || ip.frag_offset > 0)
Подтверждает
Получено меньше, чем отправлено, пропуски собраны на участке плотной пачки сразу после входа, а отправка шла по ненадёжному каналу или большие пакеты фрагментированы. Чаще бывает в клиенте с медленной загрузкой
Опровергает
Если отправлено и получено одинаково, а NPC не видно, данные отброшены после получения (отбрасывание уведомлений о появлении во время загрузки) или проблема в расчёте зоны видимости. Если пропуски бывают в любое время, независимо от входа, это потери на линии связи
UDP vs. TCPGaffer On Games UDP не гарантирует ни доставку, ни порядок, поэтому потерянные пакеты нужно обнаруживать и отправлять повторно самостоятельно