2009-11-02 17 views
5

Estoy intentando crear un complemento de C++ para un juego en 3D en tiempo real. Aunque creo que tengo una comprensión firme de la teoría del UDP, cómo funciona, cuáles son sus fortalezas y debilidades, mi principal preocupación es el rendimiento, la escalabilidad y las estadísticas probables. Soy consciente de que probablemente conozco solo una gota en los océanos que vale la pena cuando se trata de UDP e incluso de TCP.estrategia de red de multijugador UDP, se necesita asesoramiento

La pregunta:

Dado un determinado escenario , el número de jugadores que un servidor dedicado típica (s) ser capaz de hacer frente en un momento dado.

Ahora para el escenario ...

Imaginemos que tenemos un juego MMORPG en el que todos los jugadores pueden estar en cualquier lugar en el "mundo del juego". Todo el mundo envía y recibe datos al mismo servidor/servidor, ya que todos deben ser capaces de ... ver e interactuar con todos los demás, cuando finalmente se cruzan sus rutas. Es un juego de primera persona en tiempo real, por lo que las posiciones de los jugadores deben estar actualizadas, muy a tiempo.

digamos que tenemos 1000 (o incluso 10.000) jugadores en línea ...

tres cosas principales tienen que ocurrir aquí:

  1. Cada jugador transmite sus datos al servidor de juegos a través de UDP, a decir 14 envíos por segundo. En pocas palabras, esta información incluye, quién, dónde y qué es cada jugador. Los datos que se envían se han normalizado y optimizado en cuanto a tamaño y velocidad para fomentar un uso mínimo de ancho de banda.

  2. El servidor recibe, por ejemplo, hasta 1000 (una cifra no ficticia para fines de demostración) de estos paquetes 14 veces por segundo, procesando 14 000 paquetes por segundo. Esta fase de procesamiento generalmente implica la actualización de la estructura de datos de la memoria central, donde los datos de posición de los jugadores x, y, z viejos se actualizarán con su nueva posición y una marca de tiempo. Esta estructura de datos en el servidor contiene TODOS los datos para TODOS los jugadores en el mundo del juego ENTERO.

  3. El servidor (posiblemente un hilo separado, tal vez incluso una máquina separada) ahora necesita transmitir los paquetes a todos los demás jugadores, para que puedan actualizar sus pantallas para mostrar otros jugadores en el mapa. Esto también sucede 14 veces por segundo. (donde 14 podría ser típicamente una figura dinámica, cambiando en función de la capacidad de CPU utilizada, CPU ocupada, menos velocidad de cuadros y viceversa).

Lo importante es esto: para el jugador X, sólo los datos de otros jugadores dentro del alcance visual de su posición, se envían a la respectiva jugador. Entonces, si el jugador Y está a 2 millas de distancia, sus datos deben enviarse a X, pero si el jugador Z está en el otro lado del planeta, sus datos no se envían a X como un intento de ahorrar ancho de banda. Esto, por supuesto, implica un poco más de procesamiento ya que los datos tendrían que ser iterados y filtrados, usando la solución de indexación más efectiva posible.

Ahora mi preocupación es la siguiente: enviar un paquete de datos desde un equipo cliente, ingresarlo a la RAM de los servidores, realizar un pequeño proceso de actualización de los datos y transmitir selectivamente la información a otros jugadores lleva tiempo. Este significado, que hay un cierto umbral que un servidor podrá manejar, y sí, depende de la efectividad de mi implementación, la velocidad y las capacidades del hardware que se está usando y, por supuesto, otros factores externos como la velocidad de Internet. , tráfico y nr. de erupciones solares golpeando la tierra por segundo ... es broma.

Estoy tratando de averiguar de los demás, que han pasado por este proceso, cuáles son las trampas, y qué rendimiento típico puedo esperar al crear un plugin multijugador.

Podría decir fácilmente: "Quiero atender a 10000 personas jugando en el mismo servidor al mismo tiempo", y podría decir: "100 es una cifra más realista y probable, por servidor".

Por lo tanto, soy consciente de que podría tener que crear un concentrador de servidor/nube múltiple para manejar mis miles de solicitudes y envíos, distribuyendo la carga de procesamiento en varias máquinas. Así que podría tener algunas máquinas que solo se ocupan de la recepción de datos, una gran caja central, que es como una base de datos en memoria compartida de alguna manera por todas las máquinas de recepción y despacho, y luego, por supuesto, una serie de máquinas de despacho.

Obviamente, hay limitaciones técnicas, y realmente no sé qué esperar y cuáles son. Y lanzar CPU y cajas de servidores adicionales al problema no necesariamente resolverá el problema, ya que una mayor intercomunicación entre las máquinas también ralentizará un poco el proceso. Supongo que cuantas más CPU arrojes, podría reducir la efectividad e incluso revertir la productividad de la CPU en algún umbral.

¡Podría y debería considerar P2P (Peer To Peer) para el modo multijugador!

¿Soy realista diciendo que podré atender a 2500 jugadores al mismo tiempo?

¿Sería posible escalar hasta 10000 jugadores en unos años?

Sé que esta pregunta es terriblemente larga, así que por favor acepte mis más sinceras disculpas.

Respuesta

1
  • podría y debería tener en cuenta que P2P (peer to peer) para el modo multijugador? No creo que la tecnología p2p sea capaz de manejar los aspectos de redes de juegos en tiempo real. Además, en las redes p2p usuales, no estás conectado a miles de miembros a la vez, pero normalmente estás conectado a algunos nodos ascendentes, por lo que es más un gráfico que un árbol muy plano.

  • ¿Soy realista diciendo que podré atender a 2500 jugadores al mismo tiempo? No en un solo servidor. Sin embargo, al distribuir a los usuarios en varios servidores, puedes filtrarlos por región geográfica (por ejemplo, por continente o por país) dentro del mundo del juego si se trata de un mundo muy grande. Para baja latencia, de todos modos, querrás mantener los servidores cerca de las ubicaciones reales de los usuarios; no juegas en servidores europeos si vives en los EE. UU. Y viceversa.

  • ¿Sería posible escalar hasta 10000 jugadores en unos años? Hay muchas formas de optimizar la forma en que se codifican y transmiten los datos.Enviar solo deltas del estado mundial del juego, predicción del movimiento del jugador en el lado del cliente, difusión en el nivel de la red, computación en la nube en el lado del servidor, etc. y habrá más en los próximos años, esp. Cuando la industria del juego llega a las plataformas de computación basadas en la nube como OnLive, se hace evidente que necesitamos algoritmos más eficientes e infraestructura para hacer frente a esas cantidades.

2

La pregunta de escalado es completamente legítima. El enfoque en UDP, sin embargo, está fuera de lugar. No va a ser el principal problema para ti.

La razón es que las interacciones jugador-jugador son fundamentalmente un problema O (N * N). Por otro lado, el ancho de banda del servidor es un problema O (N). Teniendo en cuenta que los servidores web modernos pueden almacenar Ethernet de 1Gbit con HTTP sobre TCP, la menor sobrecarga de UDP significa que probablemente podrá saturar Ethernet de 1 Gbit con UDP siempre que sus cálculos se mantengan.

+0

Si el servidor no maneja ningún jugador a jugador, sin embargo, y simplemente actualiza y retransmite, debe ser un proceso O (n) básico. Cada cliente debe manejar una sola porción O (n) del problema general O (n^2). –

+0

Sí.Pero el problema es que estás viendo un problema O (n) con una constante no especificada, y la pregunta es precisamente sobre esa constante (!) – MSalters

1

El problema con P2P es finalmente la conexión de los usuarios finales. Los ISP generalmente no le dan mucha carga, en muchos casos < 1/10 de su velocidad de descarga. Muchos usuarios están detrás de NAT, por lo que necesitará configurar algún tipo de proxy para que los clientes inicien las conexiones. Tendrá que manejar las desconexiones del usuario y la pérdida de paquetes (para el nodo inevitable que está en la conexión inalámbrica descuidada que elimina la mitad de los paquetes). Y necesitará una buena forma de agrupar clientes por ISP/Ubicación para que no tengan 200ms + pings entre ellos.

IMO suena como un desastre esperando a suceder. Probablemente sea mejor ir con una biblioteca de redes conocida (y una arquitectura cliente/servidor tradicional) y luego intentar inventar una rueda cuadrada. Transmita solo lo que necesita actualizarse (observe cómo la mayoría de los MMO contienen grandes mundos estáticos con pocos objetos dinámicos).

1

El problema de escalado es uno de los desafíos más difíciles para los MMO y es uno que se ha resuelto parcialmente. Hay muchos ejemplos de cómo rastrear y actualizar la información del usuario.

Sin embargo, un punto que mencionaré es que, históricamente, los juegos son algo social y, como tal, hay un patrón en el que la mayoría de la gente tiende a agruparse en un área central o individual. Entonces realmente tienes que diseñar para este peor caso.

Algunos juegos son realmente una gran sensación épica, y tener todos los usuarios permitidos para agruparse y agruparse es un requisito de diseño central. Para este tipo de juego, planee que todos los usuarios estén exactamente en el mismo lugar. Para otros juegos, deberías poder dividirlos en grupos más pequeños y dividir y conquistar.

1

Podría y debería considerar P2P (Peer To Peer) para el modo multijugador - no, eso lo abre a trampas y todo tipo de problemas de confiabilidad en el mejor de los casos. Es una lata de gusanos mejor dejar sin abrir. Sin embargo, podría ayudarte con la distribución de contenido, si eso te preocupa.

¿Soy realista diciendo que podré atender a 2500 jugadores al mismo tiempo? - definitivamente, pero el énfasis está en cómo implementarlo. A mediados de los 90, los juegos de texto como Realms of Despair o Medievia manejaban cientos de jugadores en línea simultáneamente. No enviaron datos a todos 14 veces por segundo, pero sí actualizaron a esos jugadores varias veces por segundo. La potencia de cálculo se ha incrementado en un factor de aproximadamente 250 desde entonces. Comida para el pensamiento.

¿Sería posible escalar hasta 10000 jugadores en unos años? - es posible hacerlo ahora, si relaja los requisitos de ancho de banda para que no siempre envíe 14 actualizaciones por segundo, o relaje el requisito de que todo el mundo sea manejado por 1 servidor. El problema 'C10K' se dirigió al over 10 years ago. Obviamente, un cliente FTP no es un juego en tiempo real, pero, por otro lado, sus requisitos de rendimiento son mayores. Si puede tolerar un poco de latencia adicional a cambio de un mayor ancho de banda, entonces se encontrará con un ganador.

Cuestiones relacionadas