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í:
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.
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.
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.
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). –
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