Interpolar entre dois estados em rede?

11

Tenho muitas entidades do lado do cliente que são simuladas (suas velocidades são adicionadas às suas posições em uma base por quadro) e deixo que elas se considerem inoperantes. Eles enviam atualizações sobre onde foram vistos pela última vez e sua velocidade muda. Isso funciona muito bem e outros jogadores veem esse trabalho encontrar. No entanto, após algum tempo, esses jogadores começam a dessincronizar após algum tempo. Isso é devido à latência.

Gostaria de saber como posso interpolar entre estados para que eles pareçam estar na posição correta. Eu sei onde o jogador foi visto pela última vez e sua velocidade atual, mas interpolar para o último estado visto faz com que o jogador realmente se mova para trás. Eu não conseguia usar a velocidade para outros clientes e simplesmente "lê-los" na direção apropriada, mas acho que isso causaria movimentos irregulares. Quais são as alternativas?

Vaughan Hilts
fonte

Respostas:

9

Por esse motivo, você encontrará simulações que geralmente são executadas 1 ou mais quadros à frente do que é realmente processado em um determinado momento no cliente. Portanto, em outras palavras, o que você renderiza pode ser de fato o segundo último quadro, não o último quadro.

Pesquise neste artigo todas as instâncias da palavra "adiante" e acho que você começará a entender melhor a imagem do que eu expliquei acima.

Engenheiro
fonte
Ok, você está sugerindo que eu deveria renderizar o jogador como havia 300 ms atrás e interpolar para o futuro? (Em um estado separado, quando chega um novo estado; este mudariam)
Vaughan Empunhaduras
@VaughanHilts Novamente, leia o artigo e os comentários. Gaffer é um especialista nesse campo e explica muito mais claramente do que eu. Mas a ideia geral é que sim, seu modelo de simulação está à frente, enquanto sua renderização está um pouco atrás disso para explicar o efeito que você descreveu. Não é de forma alguma o único lugar em que vi essa técnica descrita.
Engineer
2

Quando voce diz:

esses jogadores começam a dessincronizar depois de algum tempo

isso me faz pensar que seu problema pode ter mais a ver com o atraso do relógio do que com os problemas de latência. Se houver latência, deve ser tão ruim no início quanto 10 minutos. Se um relógio de jogo estiver correndo um pouco mais rápido que o outro, haverá alguns artefatos de instabilidade estranhos que ficarão cada vez piores. Um cliente pode estar simulando no futuro, quando os pacotes atuais chegarem do servidor, ele puxará o cliente de volta, fazendo com que as entidades pulem. Execute mais alguns testes para descobrir.

Se os relógios fora de sincronia forem realmente um problema, você precisará examinar com muito cuidado o seu loop de atualização e garantir que todas as atualizações sejam baseadas na quantidade de tempo de jogo passada (fixa ou variável) e se o jogo -time é avançado usando algo como o relógio de parede (não renderiza o tempo ou outras variáveis). Gaffer tem alguns bons artigos sobre isso, e há uma pergunta decente aqui falando sobre timesteps fixos versus variáveis . Espero que isto ajude.

John McDonald
fonte
Não é esse o caso, é realmente o fato de que eu acho que estou muito longe (um pico de atraso ou algo assim - o pacote para 'parar' não é recebido a tempo e o cliente não pode se corrigir a tempo. o caso, porque depois que o cliente parou posso mais DEFINTELAY interpolate a sua posição.
Vaughan Hilts