Como sincronizar ações como pular no multiplayer?

11

Sou desenvolvedor de jogos iniciante e tenho pesquisado sobre jogos multiplayer. Observei que sempre há alguma latência, os jogadores sempre recebem atualizações de ações passadas. Mas existem técnicas como o ajuste de contas morto para lidar com a latência. Eu posso prever o movimento e suavizar os movimentos. Mas como eu faria ações sincronizarem como pular, parar de andar etc.

Suponha que o cliente A estivesse em movimento, ele estava a 100m às 10,2 vezes com velocidade de 100m / s e enviou essa informação. O cliente B receberia essas informações um pouco mais tarde, digamos 10.4. Portanto, no cliente B, posso usar a previsão e colocar o cliente A a 120m. Mas e se, o cliente deu um salto a 110m às 10.3. Não posso prever isso e, desde que tenho usado a previsão, não posso mostrar o salto do cliente A no passado.

Eu posso lidar com esse problema não enviando nenhuma ação de salto. Mas e se o meu jogo tiver alguns vazios em que os jogadores possam cair e morrer. Portanto, se eu não sincronizar ações de salto, outros jogadores observarão que um jogador estava correndo e ele será anulado e novamente aparecerá na tela destruindo o engajamento visual.

O salto é apenas um exemplo; pode haver muitos cenários em que a previsão não pode funcionar. Então, como lidar com eles. Um exemplo pode ser os jogos multiplayer online de arena de batalha, como o Awesomenauts.

Suyash Mohan
fonte
Eu não sei muito sobre o Multiplayer, então não poderei dar uma resposta adequada. Mas pelo que compreendi, a configuração ideal seria que seus clientes seriam mais ou menos burros e enviariam apenas teclado, mouse, gamepad ou qualquer outra entrada para o servidor, e o servidor faz todo esse movimento e atualiza coisas do mundo e envia posições e todos os outros dados relevantes de volta aos clientes, que exibem o resultado. Isso praticamente elimina a previsão e coisas semelhantes.
Christian
@Christian hey! Obrigado pela resposta. Eu conheço essa abordagem, mas isso pode agitar a jogabilidade se a latência for alta e, além disso, eu uso o sistema BaaS do AppWarp em tempo real, de modo que toda a minha lógica está apenas no lado do cliente.
Suyash Mohan 30/07/2013
A combinação dos dois métodos é o servidor autoritativo. Os clientes e o servidor simulam, os clientes enviam suas entradas, o servidor envia de volta o estado autoritário. Os clientes ajustam seu estado para corresponder ao estado autoritário. Portanto, quando os estados coincidem, os clientes executam como se estivessem sendo simulados localmente (sem atraso).
MichaelHouse
Eu encontrei recentemente esta série de tutoriais para dar boas dicas sobre a latência gestão, parece que seria relevent aos seus interesses: ligação
Kris Welsh

Respostas:

8

Cálculo morto pode não ser a melhor idéia neste caso; você deve fazer a interpolação da entidade (renderizando efetivamente os outros jogadores no passado, o que sempre fornece posições reais e válidas). Eu escrevi sobre isso com muito mais detalhes aqui . O fato de ver ou não jogadores ligeiramente no passado é aceitável ou não depende dos detalhes do que você está tentando fazer.

ggambett
fonte
4
Eu usei essa abordagem ao escrever meu primeiro jogo multiplayer em rede. Na verdade, eu usei @ ggambett's como referência. Isso funcionou bem para mim.
precisa saber é o seguinte
1

Há uma gravação bastante detalhada sobre o mecanismo de origem. Parece que parte do código fonte relevante também está disponível como parte do SDK de origem.

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Ele usa várias técnicas para tentar lidar com a latência da rede em um modelo servidor-cliente. O ponto principal parece ser que o cliente local lida com entrada e outros eventos localmente como se não houvesse servidor e, em seguida, lida com a possibilidade de o servidor dizer que o cliente fez errado mais tarde.

Vai
fonte