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

Guia do Lag em Jogos › Problemas que só afetam alguns

Confusão por reutilização de ID de entidade Entity ID reused without a generation counter

ID da causa pt-id-reuse · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento)

Abrir o card interativo, com figuras e simulações →

Se o servidor reutiliza o mesmo ID de entidade quando um NPC morto reaparece, o cliente que perdeu a mensagem de despawn nesse meio-tempo toma o NPC novo pelo antigo.

Por quê O NPC morre e reaparece com o mesmo ID de entidade → Efeito O cliente que perdeu a mensagem de despawn ignora a mensagem de spawn, achando que é “uma entidade que já conhece”, ou mantém o estado de morto → Na tela O NPC falta ou aparece caído em uma só tela, às vezes com a aparência de outro NPC

Sintomas
Invisível / entidade fantasma
Fatores
Perda de pacotes
Quem é afetado
Só um dos clientes no mesmo PC, Só eu
Quando
Aleatoriamente, de vez em quando, Quando junta muita gente
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Servidor: incluir um número de geração no ID da entidade para distinguir a reutilização. Cliente: ao receber mensagem de spawn de um ID já conhecido, apagar a entidade antiga e criar uma nova.
No gráfico
Picos aleatórios · Mensagens de spawn de IDs já conhecidos
Onde olhar
Registrar no servidor o horário de criação e remoção de cada ID de entidade (com o número de geração, se houver) e contar quantas vezes o cliente recebeu mensagem de spawn de um ID já conhecido e quantas remoções e recriações foram tratadas como “sem mudança” na atualização de visibilidade
Confirma se
O NPC invisível ou caído tem o mesmo ID de um NPC que acabou de morrer, e nesse intervalo o cliente não recebeu a mensagem de despawn ou o servidor não enviou nem a de despawn nem a de spawn
Descarta se
Se o ID tem número de geração e ele é usado na comparação, a causa é outra. Entidade invisível sem ID reutilizado: aponta para perda da mensagem de spawn
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
Saiba mais
Também acontece no lado do servidor. Se a lista de entidades no campo de visão é comparada só pelo ID, um NPC que morreu e reapareceu com o mesmo ID entre duas atualizações de visibilidade é visto como “sem mudança”, e nenhuma das duas mensagens (despawn e spawn) é enviada. Se o momento da atualização de visibilidade é diferente para cada jogador, só os clientes pegos nesse instante têm o problema.

Fontes

  1. Entity struct (Entities 1.3) Unity
    Uma Entity é formada por um Index e um número de geração (Version), o que permite saber se um Index reutilizado ainda é válido
  2. NetworkConfig class (Netcode for GameObjects 2.5) Unity
    RecycleNetworkIds e NetworkIdRecycleDelay: reutilizam um ID de rede só depois de deixá-lo livre por um tempo

Veja também

Mesma camada: Problemas que só afetam alguns

Mesmo sintoma (Invisível / entidade fantasma) em outras camadas

Ver o card interativo, com figuras e simulações