Principios de diseño de juegos multijugador en tiempo real para Node.js

12

He estado leyendo el artículo de Valve sobre redes multijugador que se ha adaptado del artículo de 2001 de Yahn Bernier llamado Métodos de compensación de latencia en el diseño y optimización de protocolos en el juego cliente / servidor . Estoy haciendo un juego multijugador en tiempo real usando un servidor node.js conectado a clientes a través de socket.io y tengo algunas preguntas sobre los principios detallados a continuación:

Interpolación de entidad

[Interpolación] evita el movimiento nervioso que esto normalmente llevaría al almacenar temporalmente las actualizaciones del servidor y luego reproducirlas con los espacios interpolados suavemente. También puede proteger contra fallas ocasionadas por la pérdida de paquetes.

Predicción del lado del cliente

La predicción es la noción de que el cliente predice los efectos de las acciones del jugador local sin esperar a que el servidor los confirme. El estado previsto de una entidad se prueba con los comandos del servidor a medida que llegan hasta que se detecta una coincidencia o una coincidencia incorrecta.

Compensación de retraso

La compensación de retraso es la noción de que el servidor usa la latencia de un jugador para rebobinar el tiempo al procesar [entrada del usuario], para ver lo que el jugador vio cuando se envió el comando. En combinación con la predicción, la compensación de retraso puede ayudar a combatir la latencia de la red hasta el punto de eliminarla desde la perspectiva de un atacante.

  • ¿Los principios se aplican a TCP como lo hacen a UDP y habría alguna diferencia en la implementación? Puedo ver que la interpolación de la entidad no necesitaría proteger contra la pérdida de paquetes, pero eso es todo.

  • ¿Puedo incluso comunicarme entre un servidor y un navegador web y viceversa usando UDP y Node.js?

  • Dado que el documento tiene más de una década, ¿se siguen utilizando estos principios o ha aparecido otra tecnología?

Cualquier ayuda sería muy apreciada.

Yoshima
fuente
1
En realidad, no necesitas UDP para los juegos multijugador, contrario a la creencia popular. Aprende de los mejores; WoW usa TCP, y creo que muchos otros juegos multijugador AAA lo hacen. ¡La gente simplemente sigue los consejos de alguien y luego pasan los siguientes 5 meses implementando una versión mala y lenta de TCP!
jcora
1
(A menos que, por supuesto, que esté seguro de que tiene el conocimiento y los recursos para desarrollar un protocolo decente sábana de UDP que podrían utilizar sus ventajas.)
jcora
1
Ningún juego AAA FPS usa TCP. Realmente es demasiado lento para los juegos que requieren una actualización en tiempo real. Pero como no está escribiendo un juego de acción, debería poder salirse con la suya.
Brendan Lesniak
@Yannbane No sabía que WoW usa TCP. Parece que muchos MMO lo hacen, por lo que pude encontrar. Me da mucha más confianza para escribir juegos multijugador con HTML5. ¡Gracias!
dreta

Respuestas:

6
  • Los principios para reducir los efectos de los retrasos son los mismos independientemente del protocolo de transporte. La pérdida de paquetes es otro tema: para muchos tipos de paquetes, la pérdida de algunos no es crítica porque la próxima actualización probablemente ya esté en camino; aquí UPD tiene la ventaja, pero cuando necesita asegurarse de que se entregue cierto paquete, necesita personalizar código de reconocimiento para hacer eso con UDP
  • Node.js admite UDP, pero los navegadores web no (sin complementos). El mejor método en tiempo real para comunicarse entre los dos es Web Sockets, que es básicamente TCP. Pero para la comunicación, es posible que desee utilizar Socket.IO, que proporciona fallos para los navegadores que no admiten sockets web.
  • Los principios siguen siendo los mismos.
Tapio
fuente
1
Supongo que esto está desactualizado: WebRTC debería ser la forma de usar una comunicación similar a UDP, ¿no?
Nikolay Tsenkov
4

Deberías consultar este artículo sobre juegos multijugador en tiempo real en HTML5 publicado en el sitio buildnewgames.com por Sven Bergstrom, él habla sobre las mismas cosas y está usando Node.JS. Tengo algo similar yendo yo mismo. Ahora estoy investigando más sobre la predicción e interpolación del lado del cliente y cosas similares antes de intentar abordar el resto.

Creo que definitivamente es posible hacer esto con Socket.IO y Node, sin embargo, la tecnología aún es nueva, por lo que habrá poca documentación y poco o nada de guías de implementación. Recomendaría hacer lo que estoy haciendo y estudiar el tema con gran detalle en términos abstractos de alto nivel y luego tratar de implementarlo usted mismo.

Cory Gross
fuente
1

Creo que la tecnología es más o menos la misma. Además, los conceptos no dependen del idioma que use o de si utiliza UDP o TCP. He escrito una explicación muy detallada de todo esto aquí http://www.gabrielgambetta.com/fpm1.html , incluyendo diagramas bonitos :)

ggambett
fuente