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

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

Perda do burst de spawns logo após a entrada Initial spawn burst lost (unreliable channel, receive buffer, fragmentation)

ID da causa pt-spawn-burst · 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 →

No instante em que o personagem entra na zona, o servidor envia de uma vez as informações de spawn de dezenas a centenas de entidades próximas. Se isso vai por um canal não confiável (unreliable), ou se o buffer de recepção estoura enquanto o socket não é lido durante o carregamento, parte se perde e não é reenviada.

Por quê Logo após a entrada, as informações de spawn chegam todas em um intervalo curto → Efeito O cliente que está carregando lê o socket tarde e o buffer de recepção do SO estoura, ou um pacote UDP grande é fragmentado e some inteiro se um único fragmento se perde. Em canal não confiável, nada é reenviado → Na tela Faltam alguns NPCs só no cliente que carrega mais devagar. Eles aparecem depois de sair do campo de visão e voltar

Sintomas
Invisível / entidade fantasma
Fatores
Perda de pacotes
Quem é afetado
Só um dos clientes no mesmo PC, Só eu
Quando
Logo após login ou manutenção, Em movimento ou ao trocar de mapa
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: enviar mensagens de spawn e despawn sempre por canal confiável, com retransmissão garantida, e dividir a informação inicial em partes. Cliente: receber em uma thread separada do carregamento, aumentar o buffer de recepção.
Números de referência
O padrão do buffer de recepção UDP no PC varia por SO, mas costuma ser de dezenas a centenas de KB. Se as informações de entrada de uma cidade lotada passam disso, basta o socket ficar um instante sem ser lido por causa do carregamento para estourar.
No gráfico
Pico logo após abrir ou manutenção · Volume recebido logo após a entrada, mensagens de spawn perdidas
Onde olhar
Comparar o número de mensagens de spawn que o servidor enviou logo após a entrada com o número que o cliente recebeu e ver por qual canal (confiável ou não confiável) foram. Em uma captura de pacotes no servidor, ver o volume enviado a esse jogador logo após a entrada e os pacotes fragmentados (filtro do Wireshark ip.flags.mf == 1 || ip.frag_offset > 0)
Confirma se
Foram recebidas menos mensagens do que enviadas, as que faltam estão concentradas no pico logo após a entrada, e o envio foi por canal não confiável ou os pacotes grandes foram fragmentados. Acontece mais no cliente que carrega mais devagar
Descarta se
Número enviado igual ao recebido, mas entidade invisível: foi descartada depois de recebida (“Mensagens de spawn descartadas durante o carregamento”) ou há problema no cálculo de visibilidade. Falta a qualquer momento, sem relação com a entrada: perda de pacotes na conexão
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo

Fontes

  1. RFC 8085: UDP Usage Guidelines IETF
    Um pacote fragmentado some inteiro se um único fragmento se perde
  2. UDP vs. TCP Gaffer On Games
    O UDP não garante entrega nem ordem, então a própria aplicação precisa detectar os pacotes perdidos e reenviá-los
  3. Socket.ReceiveBufferSize Property Microsoft
    O tamanho padrão do buffer de recepção do socket varia por SO
  4. Display Filter Reference: Internet Protocol Version 4 Wireshark
    Filtra pacotes IP fragmentados com ip.flags.mf (More fragments) e ip.frag_offset (Fragment Offset)

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