Esto está relacionado con el rendimiento de MMO, excepto que la pregunta es sobre el ancho de banda. Esto se trata de la carga de la CPU.
Creé un FPS simple usando node.js y webGL. Es extremadamente simple, muy parecido al clon BuddyMaze de MIDI Maze. Están sucediendo muy pocas cosas, todos se mueven en dos dimensiones (sin altura), disparan proyectiles simples y se topan con paredes.
En este momento, si hago múltiples conexiones al servidor donde cada jugador dispara rápidamente mientras gira en círculos, puedo obtener alrededor de 15-20 jugadores en el juego antes de que el servidor maximice un núcleo y disminuya la velocidad. Y esto es cuando se ejecuta a 30 fps en el servidor. A 10 fps, obtengo unas 25-30 conexiones. Esto es bastante malo, ya que el juego tendrá mucho más que hacer pronto y tendré que adaptar a más jugadores para que esto sea un esfuerzo factible.
Mi hermano acaba de señalar algunas estadísticas sobre el servidor TF2 de su compañero de trabajo. Su servidor tiene especificaciones más bajas que las nuestras, pero ejecuta TF2, obviamente un juego mucho más complejo, a la friolera de 500 tics por segundo, con 36 usuarios por núcleo. Además, actualmente consumimos mucho más ancho de banda que ellos, pero aún no hemos tratado de reducirlo.
¿Cómo es esto posible? ¿Qué tipo de trucos existen para aumentar el rendimiento del servidor a esta magnitud? Algunas cosas que sé incluyen:
- Disminuir la velocidad de fotogramas en el servidor e interpolar posiciones en el cliente. Obtuve algunos beneficios, pero claramente el servidor TF2 ni siquiera se molesta con esto.
- Hacer cosas costosas como la detección de colisiones en el cliente y verificarlo con poca frecuencia en el servidor. Todavía no he movido esto, lo haré esta noche. Aun así, no espero una ganancia tan enorme.
- Divide el campo de juego en regiones (árboles cuádruples) para minimizar los cálculos. No he tenido una oportunidad para esto todavía.
- He considerado la desafortunada posibilidad de que node.js sea mucho más lento que lo que sea que esté usando TF2, y puede que no sea adecuado para este tipo de tarea de alta intensidad.
- ¿Está todo en la configuración del servidor mágico?
Entonces, ¿cuáles son los otros trucos de la industria para hacer solo el mínimo requerido en el servidor pero aún así tener una experiencia de juego perfecta? Existe un gran conflicto entre "diferir al cliente para ahorrar tiempo de la CPU" y "no confiar en el cliente", por lo que tal vez sea útil saber dónde se traza la línea en varias situaciones.
Actualizar
Perfilar realmente es el único mantra que he encontrado que es absolutamente infalible. Rápidamente envolví algunas funciones de temporización alrededor de mi código (¡gracias, FP!) Y descubrí lo que nunca esperé: el acto de transmitir los datos a los clientes representa casi todo el tiempo de ejecución. Específicamente, alrededor del 90% de la misma. Pruebas posteriores mostraron que este tiempo depende tanto del número de clientes como del tamaño de los datos, pero más aún de este último. Con una carga de 20 usuarios, reduje mi tiempo de transmisión en un 90%, de 24 ms a poco más de 2 ms, enviando solo "{}" en lugar de los datos completos. Pero con solo 5 usuarios, la transmisión tarda alrededor de 0,5 ms. Entonces claramente necesito hacer alguna optimización aquí.
La primera mejora más obvia es la verificación de la línea de visión. Esto disminuiría tanto el número de personas que se preocupan por los datos, como también la cantidad de datos enviados a las partes interesadas. ¿Hay otros trucos en este ámbito que pueda probar, que se centren en minimizar el costo de mi operación de transmisión?