javascript - online - Concepto de servidor de juego de estrategia
juegos de estrategia para pc online (6)
Estoy planeando crear un juego de estrategia en tiempo real basado en WebGL, donde los jugadores puedan jugar juntos. Usaré Node.js para crear el servidor de juegos y websockets para conexiones en tiempo real.
Me he olvidado sobre cuál sería el mejor concepto para sincronizar a los clientes.
Una posibilidad sería enviar solo los pedidos de los usuarios (unidades móviles, edificios, etc.) al servidor, que los envía a todos los demás clientes. Pero aquí, tengo el problema de la demora. Creo que los juegos serían asincrónicos de esta manera.
Otra posibilidad sería calentar el juego en el servidor. Los clientes aún envían las instrucciones al servidor, pero el servidor envía ahora todos los estados modificados de todas las unidades y edificios a los clientes en un alto intervalo. El problema está aquí: la gran cantidad de datos y la rapidez con que puede ser ...
¿Tienes otras ideas o propuestas de mejora?
¡Gracias!
Básicamente tienes que decidir entre velocidad vs seguridad .
Dejar que el cliente haga el trabajo y los cálculos es más rápido, pero los datos están en riesgo porque el cliente puede manipular los datos.
Por otro lado, hacer que el servidor haga todo el trabajo es más lento pero los datos son más seguros.
Puede optar por un enfoque dual, decidir permitir que el cliente calcule solo algunos datos, sincronizar y luego verificar su validez, y dejar que el resto se ejecute en el servidor.
También depende de qué tan rápido se ejecuta el juego, la cantidad de datos para calcular, la velocidad del servidor y la banda / conexiones, etc.
Debe crear un prototipo de ambos métodos y probar algunas pruebas para emular la carga del cliente y los servidores.
Si el juego es pequeño, optaría por un trabajo más del lado del servidor. Por otro lado, para un juego mucho más complejo, probablemente lo mejor sea compartir más trabajo para el cliente. De todos modos creo que siempre se necesita una compensación.
Aquí hay algunos enlaces que pueden ser útiles.
Introducción a la programación de juegos multijugador
Estrategia de redes en tiempo real.
Hilo de programación multijugador (antiguo pero aún con muchos enlaces útiles)
Prevenir el engaño multijugador
El primer enlace me ha ayudado mucho en los días e imho sigue siendo uno de los mejores recursos disponibles sobre el tema.
Libros
Debería tener el estado y la lógica del juego en el servidor, de lo contrario, su juego está completamente abierto a las trampas. El servidor es la máxima autoridad del estado del juego.
Desafortunadamente, no tengo experiencia en los juegos en línea basados en WebGL, pero generalmente es un buen método para permitir que la lógica del juego se ejecute en el lado del cliente y sincronizar los resultados.
En este enfoque, es importante hacer un seguimiento de qué objeto del juego es "propiedad" de qué cliente. Los clientes solo envían actualizaciones (creación, actualización, eliminación) de sus propios objetos y reciben las actualizaciones de los otros objetos del juego de los otros clientes.
Además, puede configurar un marco de mensajería para enviar mensajes adicionales como "El jugador ha entrado / dejado" o algo así.
Este concepto ha demostrado ser útil para un juego que creé, y espero que sea tan útil para ti.
No estoy seguro acerca de WebGL, pero a mi entender el siguiente enfoque será bueno.
- Inicialice todos los objetos (que son comunes entre los jugadores) en el servidor y ejecútelos
- En el inicio del cliente, solicitará todo el renderizador (relacionado con el cliente específico) para los objetos que se ejecutan en el servidor.
- el cliente representará los objetos en la IU para todo el renderizado recibido.
- Cuando el cliente realice una actualización en la interfaz de usuario, los cambios se notificarán al servidor y el servidor actualizará el objeto en consecuencia
- Cuando los objetos comunes entre jugadores son modificados por un jugador, se notificará a cada jugador (cliente) para que realice cambios en la interfaz de usuario.
Este enfoque será específico para objetos comunes, no objetos específicos de UI / cliente.
Por razones de seguridad, toda la lógica debe estar en el lado de los servidores, y toda la actualización de datos está en el servidor.
Pero el cliente puede predecir cierta lógica y reproducir primero la animación, lo que se denomina predicción del cliente.
El lado del servidor se encarga de verificar la lógica del cliente, si no hay trampas, todo está hecho. Si hay alguien haciendo trampa, el servidor puede decirle al cliente que regrese al estado correcto.
Si está utilizando node.js para el servidor, hay un marco de código abierto, pomelo . Y también hay una demo de código fuente completo y una demo en línea para ello: lordofpomelo
Sugeriría mirar estos recursos con respecto a los conceptos de desarrollo de juegos basados en navegador: