Если при возрождении убитого NPC сервер снова использует тот же ID объекта, клиент, пропустивший за это время уведомление об исчезновении, принимает новый NPC за старый.
Почему NPC умирает и появляется снова с тем же ID объекта → Следствие Клиент, пропустивший уведомление об исчезновении, считает объект «уже известным» и игнорирует уведомление о появлении или оставляет объект мёртвым → На экране NPC нет только на одном экране или он лежит убитым, иногда выглядит как другой NPC
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: добавлять к ID объекта номер поколения, чтобы различать повторное использование. Клиент: получив уведомление о появлении для уже известного ID, удалять старый объект и создавать новый.
На графике
Случайные всплески · число уведомлений о появлении для уже известных ID
Где смотреть
Писать на сервере время создания и удаления по каждому ID объекта (и номер поколения, если он есть), считать, сколько раз клиент получал уведомление о появлении для уже известного ID и сколько удалений с повторным созданием при обновлении зоны видимости прошли как «без изменений»
Подтверждает
ID невидимого или лежащего NPC совпадает с ID NPC, который только что умер, и за это время клиент не получил уведомление об исчезновении или сервер не отправил ни уведомление об исчезновении, ни уведомление о появлении
Опровергает
Если у ID есть номер поколения и он участвует в сравнении, причина не эта. Если ID не переиспользован, а объекта всё равно не видно, причина в потере уведомления о появлении
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
Это бывает и на стороне сервера. Если сравнивать список объектов в зоне видимости только по ID, NPC, который между двумя обновлениями зоны видимости умер и возродился с тем же ID, считается «без изменений», и не отправляется ни уведомление об исчезновении, ни уведомление о появлении. Если обновления зоны видимости у разных игроков происходят в разные моменты, проблема бывает только у клиентов, чьё обновление пришлось на этот момент.
Источники
Entity struct (Entities 1.3)Unity Entity состоит из Index и номера поколения (Version), что позволяет понять, действителен ли ещё переиспользованный Index