Implementando suavização de rede

13

Estamos criando um jogo de tiro em primeira pessoa para multiplicadores. O cliente envia sua posição para o servidor a uma taxa fixa (atualmente em 10Hz). O servidor envia uma única mensagem contatando todas as posições do jogador para todos os jogadores na mesma taxa (10Hz).

Como esperado, o movimento é bastante instável, pois o jogo a 60fps está recebendo atualizações apenas 10 vezes por segundo. Qual é a melhor maneira de suavizar esse movimento? A maneira mais óbvia seria interpolar entre os dois últimos pacotes, para que a interpolação termine à medida que recebemos um novo pacote. Mas isso adiciona um atraso instantâneo de 100ms para todos os jogadores.

A outra maneira seria usar a velocidade e a aceleração inferidas nos últimos pacotes para prever onde o jogador está antes da chegada do próximo pacote; no entanto, se a previsão estiver errada, o jogador tenderá a pular assim que um novo pacote for recebido .

Alguém sabe como os títulos AAA resolvem esse problema?

Hannesh
fonte

Respostas:

9

Eles fazem exatamente o que você acabou de dizer - uma dessas duas abordagens ou algum compromisso entre elas. (por exemplo, aceite um pequeno atraso e interpole sempre que possível e extrapole quando o ping exceder esse atraso.) Em vez de pular (também conhecido como 'snapping') de volta para uma posição corrigida, você normalmente faz algum tipo de interpolação entre a previsão errada e o valor corrigido, suavizando-o, se possível. Você também lida com as correções no passado para reduzir a quantidade de correção que precisa aplicar.

Esta é uma pergunta freqüente e há vários links canônicos que você provavelmente encontrará em outros sites em gamedev.stackexchange.com, se você pesquisar, e eles incluem o seguinte:

O que todo programador precisa saber sobre redes de jogos (isso resume as coisas nos próximos dois links)

Rede multijogador de origem

Arquitetura de rede irreal

Kylotan
fonte