Wäre die Verwendung von Lua-Skripten zum Definieren der Spielelogik für einen MMO-Server viel langsamer als die in C ++ kompilierte?


10

Ich verwende ein Entitätssystem für meinen MMO-Server und habe darüber nachgedacht, das Verhalten von "Aktionen" mithilfe von Lua-Skripten zu definieren. Der Server ist in C ++ geschrieben. Ich bin nicht sehr vertraut mit der Geschwindigkeits- / Speichernutzung von Lua in C ++, aber ich habe es für die Skripterstellung der GUI des Clients verwendet. Würde die Verwendung von Lua zur Definition der Spielelogik auf der Serverseite die Leistung erheblich beeinträchtigen?


Antworten:


20

TL; DR: Lua hat zwar Overhead, aber wenn es richtig verwendet wird, ist es vernachlässigbar und leicht zu mildern. Verwenden Sie es nicht für schwere mathematische Operationen oder zum Transformieren von Geometrie. Sie werden wahrscheinlich überhaupt keine Leistungsprobleme feststellen, wenn Sie damit eine GUI skripten.

Ich habe einige grundlegende Benchmarks bezüglich Luas Leistung als Spieleskriptsprache durchgeführt, und es ist verdammt schnell. Mit tolua ++, um LuaJIT an meine Spiel-Engine zu binden, habe ich 2.000 Schauspieler hervorgebracht, von denen jeder von einem Lua-Skript gesteuert wird, das jede Spielschleife (mit einem Zeit-Delta-Argument) aufruft. Die Hälfte der Schauspieler hatte ein Flock-Drehbuch und die andere Hälfte machte eine Art zufälligen Spaziergang (und wurde von der Herde gemieden).

Durch das Ausschalten der Rendering-Komponente erhielt ich auf meinem Opteron 170 etwas mehr als 400 Ticks pro Sekunde (2x2,0 GHz, obwohl meine Engine zu diesem Zeitpunkt Single-Threaded war). Ich stelle mir vor, ich hätte einiges mehr herausholen können, wenn ich mich eingegraben und optimiert hätte, um vielleicht einen Teil der schweren Arbeit wieder in C ++ zu verlagern. Das 400-malige Aktualisieren von 2000 Schauspielern pro Sekunde war immer noch ziemlich beeindruckend und hat meine damaligen Erwartungen weit übertroffen.

Ich verwende Lua jetzt in allen meinen Projekten und es macht tatsächlich einen ziemlich großen Teil des tatsächlichen Spielcodes aus (KI, GUI-Layout / Logik, Ereignisse / Nachrichten). Das Erstellen von Spielen macht VIEL mehr Spaß, wenn Sie etwas schnell ändern und testen können, ohne es beenden, neu kompilieren und neu initialisieren zu müssen. Ich habe von Zeit zu Zeit einige Leistungsprobleme festgestellt, die jedoch leicht gelöst werden können, indem der fehlerhafte Code in C ++ erneut implementiert wird (und dann von Lua aufgerufen wird).

Obwohl die Server von EVE Online etwas vom Thema abweichen, sind sie fast vollständig in Stackless Python geschrieben (ich glaube, sie verschieben die meisten ihrer mathematischen Operationen auf eine C ++ - Bibliothek), die erheblich schwerer als Lua ist und auf meinen persönlichen und mehreren verfügbaren Recherchen basiert Benchmarks, weit weniger performant als LuaJIT. Sie schaffen es, mehr als 30.000 gleichzeitige Spieler ohne zu viele Probleme zu behandeln. Zugegeben, sie haben eine Menge teurer Hardware, auf der all das läuft, aber ich glaube, der Großteil der Kosten entfällt auf ihren Datenbankcluster ...

Entschuldigung für die Textwand.


1
Gute Antwort! Keine Notwendigkeit, sich für eine so ausführliche Antwort zu entschuldigen. Ich denke, ich werde mir die Zeit nehmen, um die in Lua definierten Komponenten- "Aktionen" zu entwickeln und ein Benchmarking durchzuführen. Vielen Dank!
BarakatX2

2
Der größte Erfolg bei solchen Systemen ist normalerweise das Parsen der Skripte. Stellen Sie daher sicher, dass Sie diese beim Start vorab laden.
Coderanger

Das ist ein guter Punkt. Ich kompiliere meine Lua tatsächlich vor dem Verpacken zur Freigabe in Bytecode, was die Ladezeit noch weiter verkürzen kann, obwohl ich keine Messungen durchgeführt habe.
Codewaffle

Ich bin eher anderer Meinung. Während in einem normalen Spiel die Spiellogik nur einen geringen Teil der Ausführungszeit ausmacht (das Rendern ist ein Biest), ist sie in einem MMO-Server ein viel größerer Teil, sodass die Auswirkungen weitaus größer wären. Ich habe Erfahrung mit LUAJit und C ++ und obwohl LUAJit wesentlich schneller als LUA ist, ist es immer noch viel langsamer als C ++ (vorausgesetzt, Sie codieren C ++ richtig). Ich gebe zu, dass der Workflow mit LUAJit fantastisch ist, aber in der Geschwindigkeit braucht es einen Treffer. Unabhängig davon, wie Sie es drehen, haben Variablen in Tabellen mit String-Lookups, dynamischen Typen und Garbage Collection ihren Preis. LUAJit ist langsamer als .NET, sagte Nuff
Kaj

2

Kurze Antwort: Ja, ja, das würde es.

Lange Antwort: Es hängt davon ab, wie viel Spiellogik, wie viel es ausgeführt wird und wie komplex es ist und ob Sie es für jeden Spieler ausführen müssen. Wenn es sehr einfach ist und nicht oft wiederholt wird, können Sie damit einverstanden sein. In den meisten Fällen führt die Verwendung von LUA anstelle von C ++ jedoch zu einer wesentlich geringeren Leistung und einer schlechten Skalierung, vorausgesetzt natürlich, der Code ist gut gestaltet und optimiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.