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)
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
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
Deterministic LockstepGaffer On Games Mesmo sendo determinístico na mesma máquina, o resultado de ponto flutuante pode mudar com compilador, SO ou CPU diferentes
State SynchronizationGaffer On Games Enviando o estado junto com os inputs, dá para manter os dois lados sincronizados sem determinismo perfeito
Peeking into VALORANT's NetcodeRiot 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
1500 Archers on a 28.8: Network Programming in Age of Empires and BeyondGame 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)
Floating Point DeterminismGaffer 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
/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