Princípios de design de jogos para vários jogadores em tempo real para Node.js


12

Estive lendo o artigo da Valve sobre redes para vários jogadores que foi adaptado do artigo de Yahn Bernier em 2001 chamado Métodos de compensação de latência no projeto e otimização de protocolos no cliente / servidor no jogo . Estou criando um jogo para vários jogadores em tempo real usando um servidor node.js. conectado aos clientes através do socket.io e tenho algumas perguntas sobre os princípios detalhados abaixo:

Interpolação de entidade

[Interpolação] evita o movimento instável que isso normalmente levaria ao armazenar em buffer as atualizações do servidor e depois reproduzi-las com as lacunas interpoladas suavemente entre elas. Também pode proteger contra falhas causadas pela perda de pacotes.

Previsão do lado do cliente

Previsão é a noção do cliente prever os efeitos das ações do jogador local sem esperar pelo servidor para confirmá-las. O estado previsto de uma entidade é testado em relação aos comandos do servidor à medida que chegam até que uma correspondência ou uma correspondência incorreta seja detectada.

Compensação de atraso

Compensação de atraso é a noção de que o servidor usa a latência de um jogador para retroceder o tempo ao processar [entrada do usuário], para ver o que o jogador viu quando o comando foi enviado. Em combinação com a previsão, a compensação de atraso pode ajudar a combater a latência da rede a ponto de quase eliminá-la da perspectiva de um invasor.

  • Os princípios se aplicam ao TCP como ao UDP e haveria alguma diferença na implementação? Percebo que a interpolação de entidade não precisaria proteger contra a perda de pacotes, mas é isso.

  • Posso me comunicar entre um servidor e um navegador da web e vice-versa usando UDP e Node.js?

  • Como o artigo tem mais de uma década, esses princípios ainda estão em uso ou apareceu outra tecnologia?

Qualquer ajuda seria muito apreciada.


1
Na verdade, você não precisa de UDP para jogos com vários jogadores, ao contrário da crença popular. Aprenda com os melhores; WoW usa TCP, e acredito que muitos outros jogos multiplayer AAA usam. As pessoas seguem os conselhos de alguém e passam os próximos 5 meses implementando uma versão ruim e lenta do TCP!
jcora

1
(A menos, claro, que você esteja certo de que você tem o conhecimento e os recursos para desenvolver um protocolo decente ontop de UDP que poderia usar suas vantagens.)
jcora

1
Nenhum jogo AAA FPS usa TCP. É realmente muito lento para jogos que exigem atualização em tempo real. Mas como ele não está escrevendo um jogo de ação, ele deve ser capaz de se safar do TCP.
Brendan Lesniak

@ Yannbane Não sabia que o WoW usa TCP. Parece que muitos MMOs fazem, pelo que pude encontrar. Me deixa muito mais confiante em escrever jogos multiplayer com HTML5. Obrigado!
dreta 29/07

Respostas:


6
  • Os princípios para reduzir os efeitos de defasagens são os mesmos, independentemente do protocolo de transporte. A perda de pacotes é outro tópico - para muitos tipos de pacotes, perder alguns não é crítico porque a próxima atualização provavelmente já está a caminho - aqui o UPD tem a vantagem, mas quando você precisa garantir que um determinado pacote seja entregue, você precisa personalizar código de reconhecimento para fazer isso com o UDP
  • O Node.js suporta UDP, mas os navegadores da Web não (sem plug-ins). O melhor método em tempo real para a comunicação entre os dois é o Web Sockets, que é basicamente o TCP. Mas para a comunicação, convém usar o Socket.IO, que fornece fallbacks para navegadores que não suportam soquetes da web.
  • Os princípios permanecem os mesmos.

1
Eu acho que isso está desatualizado - o WebRTC deve ser o caminho para usar a comunicação semelhante ao UDP, não é?
Nikolay Tsenkov

4

Você deve conferir este artigo sobre os jogos multijogador em tempo real em HTML5, publicado no site buildnewgames.com por Sven Bergstrom, ele fala sobre as mesmas coisas e está usando o Node.JS. Eu mesmo tenho algo parecido. Agora, estou pesquisando mais sobre a previsão e interpolação do lado do cliente e coisas do gênero antes de tentar resolver o restante.

Eu acredito que é definitivamente possível fazer isso com o Socket.IO e o Node, no entanto, a tecnologia ainda é nova, portanto haverá pouca documentação e pouco ou nada no caminho dos guias de implementação. Eu recomendaria fazer o que estou fazendo e estudar o assunto detalhadamente em termos abstratos de alto nível e tentar implementá-lo você mesmo.


1

Eu acredito que a tecnologia é praticamente a mesma. Além disso, os conceitos não dependem de qual idioma você usa ou se utiliza UDP ou TCP. Eu escrevi uma explicação muito detalhada de tudo aqui http://www.gabrielgambetta.com/fpm1.html , incluindo belos diagramas :)

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.