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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.