ID da causa sp-broadcast · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de servidores (Equipe de infraestrutura)
Se o movimento de cada jogador é enviado a todos que o veem, o número de atualizações a enviar cresce com o quadrado do número de jogadores reunidos.
Por quê A mudança de um jogador é enviada a todos que podem vê-lo → Efeito Com 1.000 jogadores vendo uns aos outros, são 1 milhão de atualizações por tick → Na tela A fila de envio e a largura de banda saturam: atraso e perda (input lag, avanço rápido, teleporte)
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de servidores (Equipe de infraestrutura)
O que fazer (Equipe de desenvolvimento)
Reduzir a frequência de atualização conforme a distância e a importância (inimigos próximos a cada tick, jogadores distantes algumas vezes por segundo), limitar o volume enviado a cada jogador e preencher primeiro o que é mais importante, juntar várias atualizações num pacote, limitar o número de jogadores exibidos.
O que fazer (Equipe de infraestrutura)
Comparar a largura de banda de envio e os pacotes por segundo de cada servidor com os limites de rede da NIC e da instância e alertar, conferir a folga antes de eventos grandes.
Números de referência
1.000 jogadores × 1.000 jogadores × 20 ticks = 20 milhões por segundo. A 40 bytes cada, são cerca de 6,4 Gbps no servidor inteiro e cerca de 6,4 Mbps por jogador que recebe. Limitando a 150 jogadores visíveis, cai para cerca de 1 Gbps no total e cerca de 1 Mbps por jogador.
No gráfico
Sobe com a carga · Pacotes e bytes enviados pelo servidor, jogadores reunidos num só lugar
Onde olhar
txpck/s e txkB/s do sar -n DEV 1 (pacotes e KB enviados por segundo pela NIC do servidor) junto com o gráfico de jogadores. Em instâncias de nuvem, os contadores de limite excedido do ethtool -S (no ENA da AWS, bw_out_allowance_exceeded e pps_allowance_exceeded)
Confirma se
Quando o número de jogadores reunidos aumenta, os pacotes e bytes enviados crescem mais rápido que o número de jogadores (quase ao quadrado), e a partir do momento em que batem no limite os contadores de limite excedido ou os descartes no envio sobem
Descarta se
Volume enviado estável, mas o tempo de tick sobe: cálculo de visibilidade ou lógica do jogo
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
HED-GP Technical Retrospective: What a HED-acheCCP Games O envio O(n²), em que n jogadores precisam ver a ação de n jogadores, é o fator limitante inevitável das grandes batalhas de frotas
Actor Priority in Unreal EngineEpic Games Quando a largura de banda da conexão satura, cada ator recebe uma prioridade (distância, linha de visão, tempo desde o último envio) e a banda é distribuída a partir dos mais importantes
Detailed Actor Replication Flow in Unreal EngineEpic Games NetUpdateFrequency define a frequência de atualização de cada ator; o envio segue a ordem de prioridade e, quando a conexão satura, o restante fica para o próximo tick
sar(1) — Linux manual pagesysstat rxpck/s e txpck/s (pacotes recebidos e enviados por segundo) e rxkB/s e txkB/s (KB recebidos e enviados por segundo) do sar -n DEV