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.