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

Guia do Lag em Jogos › Design de sincronização

Divergência no cálculo de caminho na sincronização de comandos Command sync with divergent pathing

ID da causa sy-path-mismatch · 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 cliente e servidor trocam só “vá para cá” e cada lado calcula o caminho por conta própria, basta uma pequena diferença no cálculo para um personagem ou monstro seguir outro caminho e depois ser puxado de volta para o lugar certo.

Por quê No movimento por clique e na perseguição de monstros, só o destino é enviado, e o cliente calcula o caminho por conta própria → Efeito Diferenças nos dados do terreno, colisões com outros personagens e ordem de cálculo diferente fazem o movimento seguir um caminho diferente do servidor → Na tela O monstro atravessa a parede e de repente é movido para outro lugar, o personagem que você clicou muda de direção como se deslizasse

Sintomas
Teleporte, Rubber banding
Fatores
Latência
Quem é afetado
Local ou canal específico, Só eu
Quando
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 também os pontos intermediários do caminho (waypoints), sincronizar a posição periodicamente. Cliente: corrigir as divergências de forma suave, usar os mesmos dados de terreno do servidor.
No gráfico
Picos aleatórios · Número e distância das correções de posição por entidade
Onde olhar
Registrar por entidade a diferença entre a posição enviada pelo servidor e a calculada pelo cliente e marcar no mapa as coordenadas onde houve correção. Resumir o caminho ou a posição dos dois lados em checksums e comparar periodicamente ajuda a achar o momento em que começaram a divergir
Confirma se
As correções se concentram em certos terrenos (degraus, passagens estreitas, rampas) ou em lugares lotados e se repetem no mesmo ponto até para jogadores com métricas de rede normais
Descarta se
Correções em qualquer lugar, só nos momentos de pico de perda ou jitter: problema de conexão. Um monstro que pula na tela de várias pessoas ao mesmo tempo: verificar se a autoridade do monstro está em um cliente com lag
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
Saiba mais
Esse modelo é um dos motivos de jogos de movimento por clique e de tab target serem pouco sensíveis ao ping. Em troca, não há garantia de que os dois lados chegam ao mesmo resultado, por isso um mecanismo que sincroniza a posição de vez em quando é indispensável. Cálculos de ponto flutuante podem dar resultados ligeiramente diferentes conforme o tipo de CPU, o compilador e as opções de otimização (incluindo a diferença entre builds debug e release). Em arquiteturas como lockstep e rollback, que trocam só os inputs e supõem que os dois lados chegam ao mesmo resultado, essas pequenas diferenças podem se acumular até o estado do jogo das duas telas se separar (desync).

Fontes

  1. Deterministic Lockstep Gaffer On Games
    Mesmo sendo determinístico na mesma máquina, o resultado de ponto flutuante pode mudar com compilador, SO ou CPU diferentes
  2. State Synchronization Gaffer On Games
    Enviando o estado junto com os inputs, dá para manter os dois lados sincronizados sem determinismo perfeito
  3. Peeking into VALORANT's Netcode Riot Games
    Perda de pacotes ou dois personagens tentando ir para o mesmo lugar fazem as simulações do servidor e do cliente divergirem, exigindo correção
  4. 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond Game Developer
    Diferenças minúsculas crescem com o tempo, e o caminho dos trabalhadores vai se desviando aos poucos. Comparação de mundo, entidades e pathfinding por checksum para achar a dessincronização (out-of-sync)
  5. Floating Point Determinism Gaffer On Games
    O mesmo código de ponto flutuante pode dar resultados diferentes conforme o compilador, a arquitetura da CPU e o build debug ou release. Caso em que CPUs AMD e Intel deram valores um pouco diferentes em funções transcendentais
  6. /fp (Specify floating-point behavior) Microsoft
    /fp:fast pode reordenar ou combinar operações de ponto flutuante e dar resultados diferentes das outras opções /fp, e operações combinadas em FMA também podem diferir de multiplicar e somar separadamente

Veja também

Mesma camada: Design de sincronização

Mesmo sintoma (Teleporte) em outras camadas

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