¿Usar los scripts de Lua para definir la lógica del juego para un servidor MMO sería mucho más lento que el compilado en C ++?

10

Estoy usando un sistema de entidad para mi servidor MMO y estaba pensando en definir el comportamiento de las "acciones" usando los scripts de Lua. El servidor está escrito en C ++. No estoy muy familiarizado con el uso de la velocidad / memoria de Lua en C ++, pero lo he usado para crear secuencias de comandos de la GUI del cliente. ¿Usar Lua para definir la lógica del juego en el lado del servidor reduciría mucho el rendimiento?

BarakatX2
fuente
Pregunta relacionada: gamedev.stackexchange.com/questions/2913/…
Tetrad

Respuestas:

20

TL; DR: Lua tiene gastos generales, pero si se usa correctamente es insignificante y fácil de mitigar. No lo use para operaciones matemáticas pesadas o geometría transformadora. Probablemente no verá ningún problema de rendimiento en absoluto al usarlo para escribir una GUI.

He hecho algunos puntos de referencia básicos con respecto al rendimiento de Lua como lenguaje de programación de juegos, y es bastante rápido. Usando tolua ++ para vincular LuaJIT a mi motor de juego, generé 2,000 actores, cada actor controlado por un script Lua llamado cada bucle de juego (con un argumento de tiempo-delta). La mitad de los actores tenía un guión de congregación y la otra mitad estaba haciendo una especie de caminata aleatoria (y el rebaño los evitó).

Apagar el componente de renderizado me dio un poco más de 400 tics por segundo en mi Opteron 170 (2x2.0GHz, aunque mi motor tenía un solo subproceso en ese momento). Me imagino que podría haber exprimido un poco más que eso si me interesara y optimizase, quizás moviendo parte del trabajo pesado a C ++. La actualización de 2000 actores 400 veces por segundo todavía era bastante impresionante, y superó con creces mis expectativas en ese momento.

Ahora uso Lua en todos mis proyectos, y en realidad constituye una porción bastante grande del código real del juego (AI, diseño / lógica GUI, Eventos / Mensajes). Hacer juegos es MUCHO más divertido cuando puedes cambiar algo rápidamente y probarlo sin tener que salir, volver a compilar y reiniciar. Me he encontrado con algunos problemas de rendimiento de vez en cuando, pero estos se resuelven fácilmente al volver a implementar el código ofensivo en C ++ (y luego llamarlo desde Lua).

Aunque un poco fuera de tema, los servidores de EVE Online están escritos casi por completo en Python apilable (creo que difieren la mayoría de sus operaciones matemáticas a una biblioteca C ++), que es considerablemente más pesado que Lua y, según mi propia investigación personal y varias disponibles puntos de referencia, mucho menos rendimiento que LuaJIT. Se las arreglan para manejar más de 30k jugadores simultáneos sin demasiados problemas. De acuerdo, tienen una tonelada de hardware costoso que ejecuta todo eso, pero creo que la mayoría del costo está en su grupo de bases de datos ...

Disculpas por el muro de texto.

Codewaffle
fuente
1
¡Gran respuesta! No hay necesidad de disculpas por una respuesta tan detallada. Creo que me tomaré el tiempo para desarrollar las "acciones" de componentes definidas en Lua y hacer algunas evaluaciones comparativas. ¡Gracias!
BarakatX2
2
El mayor éxito en este tipo de sistemas generalmente es analizar los scripts, así que asegúrese de cargarlo al inicio.
coderanger
Este es un buen punto. De hecho, compilo mi Lua en bytecode antes de empaquetarlo para su lanzamiento, lo que puede reducir el tiempo de carga aún más, aunque no he realizado ninguna medición.
Codewaffle
Tiendo a estar en desacuerdo. Mientras que en un juego normal la lógica es una parte menor del tiempo de ejecución (la representación es una bestia), en un servidor MMO es una parte mucho más grande, por lo que el impacto sería mucho más sustancial. Tengo experiencia con LUAJit y C ++ y, aunque LUAJit es sustancialmente más rápido que LUA, sigue siendo mucho más lento que C ++ (suponiendo que codifique C ++ correctamente). Admito que el flujo de trabajo con LUAJit es impresionante, pero en cuanto a velocidad, es un éxito. No importa cómo lo tuerza, las variables en tablas con búsquedas de cadenas, tipos dinámicos y recolección de basura tienen un precio. LUAJit es más lento que .NET, dijo nuff
Kaj
2

Respuesta corta: Sí, sí lo haría.

Respuesta larga: depende de cuánta lógica del juego, cuánto se ejecuta y cuán complejo es, y si necesita ejecutarlo para cada jugador. Si es muy simple y no se repite mucho, podría estar bien con eso. Pero para la mayoría de los casos, usar LUA en lugar de C ++ le dará un rendimiento mucho más bajo y se escalará mal, suponiendo, por supuesto, que el código esté bien diseñado y optimizado.

AttackingHobo
fuente