L'utilisation de scripts Lua pour définir la logique de jeu d'un serveur MMO serait-elle beaucoup plus lente que celle compilée en C ++?

10

J'utilise un système d'entités pour mon serveur MMO et je pensais à définir le comportement des "actions" à l'aide de scripts Lua. Le serveur est écrit en C ++. Je ne suis pas très familier avec l'utilisation de la vitesse / mémoire de Lua en C ++ mais je l'ai utilisé pour créer des scripts pour l'interface graphique du client. Est-ce que l'utilisation de Lua pour définir la logique du jeu côté serveur réduirait considérablement les performances?

BarakatX2
la source

Réponses:

20

TL; DR: Lua a des frais généraux, mais s'il est utilisé correctement, il est négligeable et facilement atténué. Ne l'utilisez pas pour des opérations mathématiques lourdes ou pour transformer la géométrie. Vous ne verrez probablement aucun problème de performances en l'utilisant pour créer un script pour une interface graphique.

J'ai fait quelques repères de base concernant les performances de Lua en tant que langage de script de jeu, et c'est sacrément rapide. En utilisant tolua ++ pour lier LuaJIT à mon moteur de jeu, j'ai engendré 2000 acteurs, chaque acteur contrôlé par un script Lua appelé chaque boucle de jeu (avec un argument temps-delta). La moitié des acteurs avaient un scénario de flocage et l'autre moitié faisait une sorte de marche aléatoire (et a été évitée par le troupeau).

Désactiver le composant de rendu m'a donné un peu plus de 400 ticks par seconde sur mon Opteron 170 (2x2.0GHz, bien que mon moteur était à filetage unique à l'époque). J'imagine que j'aurais pu faire un peu plus que cela si j'avais creusé et optimisé, peut-être en replaçant une partie du travail lourd en C ++. Mettre à jour 2000 acteurs 400 fois par seconde était encore assez impressionnant et dépassait de loin mes attentes à l'époque.

J'utilise maintenant Lua dans tous mes projets, et il constitue en fait une assez grande partie du code de jeu réel (IA, disposition / logique de l'interface graphique, événements / messages). Faire des jeux est BEAUCOUP plus amusant quand vous pouvez rapidement changer quelque chose et le tester sans avoir à quitter, recompiler et réinitialiser. J'ai rencontré de temps en temps des problèmes de performances, mais ceux-ci sont facilement résolus en réimplémentant le code incriminé en C ++ (puis en l'appelant depuis Lua).

Bien que légèrement hors sujet, les serveurs d'EVE Online sont écrits presque entièrement en Stackless Python (je crois qu'ils reportent la plupart de leurs opérations mathématiques à une bibliothèque C ++), ce qui est considérablement plus lourd que Lua et, d'après mes propres recherches personnelles et plusieurs disponibles des références, beaucoup moins performantes que LuaJIT. Ils parviennent à gérer plus de 30 000 joueurs simultanés sans trop de problèmes. Certes, ils ont une tonne de matériel coûteux qui exécute tout cela, mais je pense que la majorité du coût est dans leur cluster de base de données ...

Toutes mes excuses pour le mur de texte.

Codewaffle
la source
1
Très bonne réponse! Pas besoin d'excuses pour une réponse aussi détaillée. Je pense que je vais prendre le temps de développer des "actions" composantes définies dans Lua et de faire un benchmarking. Merci!
BarakatX2
2
Le plus gros succès de ces types de systèmes est généralement l'analyse des scripts, alors assurez-vous de le télécharger au démarrage.
coderanger
C'est un bon point. En fait, je compile mon Lua en bytecode avant de l'empaqueter pour publication, ce qui peut réduire encore plus le temps de chargement, bien que je n'aie fait aucune mesure.
Codewaffle
J'ai tendance à être en désaccord. Alors que dans un jeu normal, la logique du jeu est une partie mineure du temps d'exécution (le rendu est une bête), dans un serveur MMO, c'est une partie beaucoup plus grande, donc l'impact serait beaucoup plus substantiel. J'ai de l'expérience avec LUAJit et C ++ et bien que LUAJit soit substantiellement plus rapide que LUA, il est toujours beaucoup plus lent que C ++ (en supposant que vous codiez C ++ correctement). J'admets que le flux de travail avec LUAJit est génial, mais en termes de vitesse, il prend un coup. Peu importe comment vous le tournez, les variables dans les tableaux avec des recherches de chaînes, les types dynamiques et la récupération de place ont un prix. LUAJit est plus lent que .NET, a dit Nuff
Kaj
2

Réponse courte: oui, oui.

Réponse longue: cela dépend de la logique du jeu, de son exécution, de sa complexité et de la nécessité de l'exécuter pour chaque joueur. Si elle est très simple et ne se répète pas souvent, cela pourrait vous convenir. Mais dans la plupart des cas, l'utilisation de LUA au lieu de C ++ vous donnera des performances beaucoup plus faibles et évoluera mal, en supposant bien sûr que le code est bien conçu et optimisé.

AttackingHobo
la source