¿Cómo estructurar un servidor de juego simple para un juego multijugador?


9

Me gustaría crear un servidor de juego multijugador simple para un juego simple:

Se supone que el juego es similar a Command & Conquer, tienes algunos tanques y algunos soldados. Puede seleccionar un soldado y luego hacer clic en el mapa, a donde debe ir el soldado. Si el soldado llega a un área donde no puede ir, camina. Y los soldados pueden ser derribados por los enemigos.

¿Cómo debo estructurar el servidor del juego y qué debo hacer en el cliente?

Es decir, si un soldado se mueve de X a Y pero alrededor del edificio Z, supongo que el servidor debe poder calcular exactamente dónde se encuentra el soldado (en caso de que un enemigo le dispare), y el cliente también debe conocer la posición para pintando al soldado.

Lo que se debe hacer en el servidor y creo que tengo que diseñar un protocolo para esto. Creo que el servidor tiene que hacer un seguimiento del estado del juego y la hora. ¿Alguien tiene sugerencias sobre cómo hacer esto? o podría recomendar un poco de lectura?

Respuestas:


12

En general es un tema muy complejo. Tienes dos objetivos en conflicto (al menos si no planeas ejecutar todos los juegos en un servidor dedicado):

  1. Querrá hacer todo lo posible en el servidor, tanto para evitar trampas como para asegurarse de que todos los clientes vean las mismas cosas.
  2. Pero también quiere que las cosas sean justas, lo que significa que si una persona tiene un ping 0 al servidor mientras que otras tienen retraso de red, cuando ambos emiten un comando a sus unidades al mismo tiempo, el jugador del "servidor" tiene una ventaja .

No puedo decir exactamente cómo resolver eso para un RTS. Lo que hacemos para nuestro disparo FPS es que el servidor guarde un estado mundial completo hace un tiempo y deje que el cliente marque cada momento. Cuando el mensaje de red para "¡Disparé!" llega al servidor, el servidor puede hacer retroceder el mundo y hacer pruebas de colisión, etc. en el mundo "tal como buscaba al cliente cuando se disparó el tiro".

Si planea tener muchas unidades, también tendrá el problema de tener potencialmente demasiado procesamiento para que el servidor lo maneje. Si no está terriblemente preocupado por piratear o hacer trampa, le sugiero que busque a los clientes y envíe los resultados al servidor.

Sin embargo, otra opción podría ser peer2peer, dejando que cada cliente se ocupe de las actualizaciones para los equipos locales, pero eso abre la pregunta de cómo determinar quién golpea qué y así sucesivamente.

Dependiendo de cuán complejo es este proyecto y cuánto esfuerzo está dispuesto a gastar en él, mi mejor sugerencia sería decidir algo preliminar y comenzar a trabajar en él para probarlo.


1
En realidad, hay tres (o tal vez más) objetivos en conflicto. El tercero es el rendimiento, mantener y actualizar completamente el estado de un juego en tiempo real en el servidor utiliza muchos recursos.
Bart van Heukelom

2
Ah, y puedes resolver fácilmente el n. ° 2 introduciendo un retraso artificial que sea igual al promedio del retraso de los otros jugadores. Bueno, si puedes llamar "hacer que sea malo para todos" una solución, eso es.
Bart van Heukelom

@Bart: en parte cierto, pero, por supuesto, debería haber un límite en la cantidad de retraso que introduces artificialmente, o las conexiones más lentas podrían forzar constantemente a las conexiones más rápidas a retrasarse demasiado, lo que definitivamente es lo que quieres ahora.
o0 '.

Encontrar el mejor camino no es un problema si se realiza en el cliente, siempre que lo haya encontrado, envía la solución al servidor, que, como con todo movimiento, verifica si es correcta.
o0 '.

2

Básicamente hay dos enfoques:

  1. Cliente de confianza
  2. Cliente no confiable

El cliente de confianza es un poco más complejo, pero tiene la ventaja de que puede descargar gran parte de sus cálculos del servidor. El costo de operación del servidor es uno de los mayores problemas para los juegos multijugador y reducirá seriamente su escalabilidad.

Un buen enfoque (para principiantes) es dejar que cada cliente de los jugadores maneje sus propias unidades. En el siguiente paso, puede usar ciclos de reserva para permitir que los jugadores clientes verifiquen las acciones de otros clientes. El servidor no debería necesitar hacer más que intercambiar mensajes, mantener la sincronización y garantizar la persistencia (por ejemplo, la base de datos).

Si planea tener algún tipo de lobby o chat, entonces maneje cada uno de estos temas en un servidor adicional. Hará las cosas mucho más fáciles en el futuro.


Gracias, eso fue informativo. Creo que iré por clientes que no son de confianza, y debo hacer el trabajo en el servidor. No tendré muchos jugadores al principio.
Jonas

1
"No tendré muchos jugadores ..." No puedo contar la cantidad de desarrolladores que me dieron esa línea y regresaron seis semanas después con: "Tengo estos 5000 jugadores que quieren pagar para jugar mi juego, pero no puedo escalar :( ". ¡Solo tenlo en cuenta!
Andreas

99
"Cliente de confianza" no es un enfoque, es un error.
o0 '.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.