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

Анатомия игровых лагов › Проблемы только у части игроков

Путаница из-за повторного использования ID объектов Entity ID reused without a generation counter

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

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

Если при возрождении убитого NPC сервер снова использует тот же ID объекта, клиент, пропустивший за это время уведомление об исчезновении, принимает новый NPC за старый.

Почему NPC умирает и появляется снова с тем же ID объекта → Следствие Клиент, пропустивший уведомление об исчезновении, считает объект «уже известным» и игнорирует уведомление о появлении или оставляет объект мёртвым → На экране NPC нет только на одном экране или он лежит убитым, иногда выглядит как другой NPC

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

Источники

  1. Entity struct (Entities 1.3) Unity
    Entity состоит из Index и номера поколения (Version), что позволяет понять, действителен ли ещё переиспользованный Index
  2. NetworkConfig class (Netcode for GameObjects 2.5) Unity
    RecycleNetworkIds, NetworkIdRecycleDelay: сетевой ID используется повторно только после того, как пробыл свободным заданное время

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

Тот же слой: Проблемы только у части игроков

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

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