In meinem aktuellen Projekt werden Lua-Skripte von den C ++ - Funktionen auf der Serverseite aufgerufen. Danach rufen die Skripte erneut die C ++ - Funktionen auf, die sich noch in dieser Lösung befinden. Warum sollten wir so etwas tun und die C ++ - Funktion nicht direkt aufrufen? In welchen Situationen werden Skripte benötigt?
Skripte werden normalerweise zur Laufzeit kompiliert , während die Hostsprache zur Kompilierungszeit kompiliert wird. Dies bedeutet, dass wir nicht neu kompilieren müssen, wenn sich das Skript ändert. Das Neukompilieren eines vollständigen Spiels kann Minuten bis Stunden dauern, was einen großen Produktivitätsverlust zur Folge hat.
In der Regel wird der kritische Code oder der Backend-Code nicht mit einem Skript versehen. Dieser Code sollte schnell ausgeführt werden und häufig ist die Speicherverwaltung von entscheidender Bedeutung.
In Spielen sind die Spielelogik und -konfiguration normalerweise in Skriptdateien enthalten. Diese Skripte können leicht von Nicht-Programmierern (wie dem Designer) aktualisiert werden , um das Gameplay zu optimieren. Skriptsprachen sind einfach und verzeihend für diesen Zweck.
Oft wird auch eine Skriptsprache verwendet, um Skripte in Echtzeit zu erstellen . Dies ist praktisch, um einige Gameplay-Elemente zu optimieren oder sogar um Fehler zu beheben. Viele Spiele bieten eine Konsole für diesen (meist internen) Zweck.
Es ist sehr gut möglich, dass Sie ein Spiel mit einer vorhandenen Game-Engine erstellen, indem Sie einfach ein Skript erstellen. Die Game-Engine-Schicht ist somit vollständig von der Game-Logik-Schicht entkoppelt . Moderne Engines können normalerweise verwendet werden, um FPS- oder RTS-Spiele wie dieses zu erstellen, aber es ist für kein Genre möglich. Ein MMO würde wahrscheinlich einen anderen Motortyp erfordern.
Die Quintessenz ist also die Entkopplung. Die oben aufgeführten Vorteile übersteigen häufig die zusätzliche Arbeit beim Erstellen oder Integrieren einer Skriptsprache.
+1 für die Aussage, dass Skripte in der Regel von Nicht-Programmierern leichter zu aktualisieren sind. Designer sind nicht immer Programmierer und müssen es auch nicht sein.
Oak
19
Ich habe das Gefühl, dass ich mich bei jeder Frage zum Thema Scripting wiederhole. Wenn für Ihren Workflow Programmierer erforderlich sind (einschließlich Scripting), werden Sie später in den Arsch gebissen. Designer sind nicht immer Programmierer, aber sobald sie nicht-triviale Skripte schreiben (z. B. sobald sie versuchen, eine Funktion zu definieren oder eine Schleife zu verwenden), geben sie vor, eine zu sein. Wenn sie kein Programmiertraining haben, wird das für alle zu Tränen und Zeitverschwendung führen.
5
Joe - das macht das Argument nicht ungültig, es bedeutet nur, dass Sie entscheiden müssen, wo Sie das "Programmiermaterial" vom "Designmaterial" entkoppeln möchten, und die Trennlinie wird je nach technischem Fachwissen Ihrer Designer unterschiedlich sein (oder fehlen davon).
Ian Schreiber
3
Ich bin mir ziemlich sicher, dass jeder selbstbewusste Designer gut in mindestens einer Sprache unterrichtet wird. Um die Dinge ein wenig zu klären, möchte ich den Begriff "Nicht-Programmierer" nuancieren, da jemand, dessen Beruf nicht der eines Software-Ingenieurs ist. Ich bedaure die Verwendung des Begriffs, dank Joe sehe ich, dass er nicht eindeutig ist. Ich glaube, es gibt eine breite Palette von Programmierern, von denen, die einfaches XML schreiben, über Hardcore-Assembler bis hin zu mathematisch anspruchsvollen Signalverarbeitungen. Ich hoffe, dies löst das Dualitätsproblem "Nicht-Programmierer".
Nef
8
Ich habe niemanden vorschlagen hören, dass Designer komplexe, geschäftskritische Skripte für die Produktion schreiben sollten. Designer mit bescheidenem Programmierverständnis können jedoch einige Skripte noch experimentell optimieren (und sie dann tatsächlichen Programmierern übergeben). Sie könnten sicherlich zur Laufzeit einfache Ad-hoc-Skripte von einer Konsole aus schreiben, um ihre eigenen Tests zu vereinfachen. Ich stelle mir vor, dass Designer grundlegende Skripts verwenden möchten, um neue Bildschirmdesigns zu erstellen (auch wenn es sich nur um semi-funktionale, interaktive Modelle handelt). Viele nicht-produktive Codes müssen geschrieben werden.
Mike Strobel
38
Sie haben die falsche Frage gestellt. Ich denke, die eigentliche Frage ist, warum wir es mit "Nicht-Skripting" -Sprachen wie C, C ++, Java usw. aufnehmen? Und die Antwort ist ein Grund: Leistung. (Und vielleicht Trägheit, aber diese Trägheit liegt an der Leistung, und jeder, der gut C / C ++ / Java schreiben kann, kann mindestens passierbares Ruby / Python / Lua / JavaScript schreiben.)
Wir verwenden "Scripting" -Sprachen (was wirklich bedeutet, dass sehr viel Code gesammelt und in der Regel etwas lockerer geschrieben und dynamisch kompiliert wird), da diese Sprachen im Allgemeinen für jeden einfacher sind - einschließlich Programmierer -, um Code zu schreiben. Es gibt weniger dummes Zeug wie daran zu denken, nach dem Malloc zu befreien oder sicherzustellen, dass Ihr Code ausnahmesicher ist, oder daran zu denken, alle Ihre Destruktoren virtuell zu machen. Wenn unsere Computer unendlich schnell wären, würden wir für alles Skriptsprachen verwenden.
Mir gefällt dieses Argument so viel besser als "damit Designer programmieren können". Es ist eine sehr schlechte Idee, den Wert einer schnellen Entwicklung zu verwerfen und mit Änderungen experimentieren zu können, ohne alles neu zu kompilieren.
Ojrac
10
Skriptsprachen für die Spielelogik sind ein sehr gutes Beispiel für das Softwarearchitekturmuster Alternate Hard und Soft Layers . Auf dieser Website (und ich bin mir sicher auch auf anderen Websites) gibt es eine gute Diskussion über die Vorteile.
Skriptänderungen sind einfach bereitzustellen. Beispielsweise können Sie Skripts in einer Datenbank aufbewahren. Dies bedeutet, dass Sie anstelle einer vollständigen binären Neuimplementierung und eines möglichen Neustarts des Dienstes nur eine einzige SQL-UPDATE-Anweisung absetzen und möglicherweise ein Signal an Ihren ausgeführten Dienst senden, um das Skript neu zu laden.
Auch Skriptsprachen sind oft einfach zu verstehen und leicht zu programmieren, sodass Sie für den Großteil des Codes (wenn Sie ein großes RPG verwenden) keine "Hardcore" -Entwickler (die sich mit Speicherverwaltung / Zeigern und Optimierungen auf CPU-Ebene befassen) benötigen. Die Skripte für KI, Zaubersprüche, Gegenstandseffekte und die Welt selbst sind oft größer als der Engine-Code. Skriptsprachen ermöglichen es, sich aufgrund der Garbage Collection (im Falle von Lua) und einer höheren Abstraktionsebene viel mehr auf das 'Was' als auf das 'Wie' zu konzentrieren.
Ein Szenario, in dem die Skripte nützlich sind, besteht darin, dass unsere Engine durch Plugins / Addons erweiterbar sein soll. Diese Erweiterungen werden in vielen Fällen von nicht professionellen Leuten (wie fortgeschrittenen Spielern und Enthusiasten) erstellt. Skripte sind zu diesem Zweck sicherer und einfacher. Durch die Verwendung von Skripten müssen sie keine Compiler verwenden und sich der Zeiger nicht bewusst sein ...
Ein gutes Beispiel dafür ist das Spiel World of Warcraft. Es hat Tausende von Addons, die von der Community erstellt wurden. Diese Addons werden mit LUA + XML geschrieben.
Sie haben die falsche Frage gestellt. Ich denke, die eigentliche Frage ist, warum wir es mit "Nicht-Skripting" -Sprachen wie C, C ++, Java usw. aufnehmen? Und die Antwort ist ein Grund: Leistung. (Und vielleicht Trägheit, aber diese Trägheit liegt an der Leistung, und jeder, der gut C / C ++ / Java schreiben kann, kann mindestens passierbares Ruby / Python / Lua / JavaScript schreiben.)
Wir verwenden "Scripting" -Sprachen (was wirklich bedeutet, dass sehr viel Code gesammelt und in der Regel etwas lockerer geschrieben und dynamisch kompiliert wird), da diese Sprachen im Allgemeinen für jeden einfacher sind - einschließlich Programmierer -, um Code zu schreiben. Es gibt weniger dummes Zeug wie daran zu denken, nach dem Malloc zu befreien oder sicherzustellen, dass Ihr Code ausnahmesicher ist, oder daran zu denken, alle Ihre Destruktoren virtuell zu machen. Wenn unsere Computer unendlich schnell wären, würden wir für alles Skriptsprachen verwenden.
quelle
Skriptsprachen für die Spielelogik sind ein sehr gutes Beispiel für das Softwarearchitekturmuster Alternate Hard und Soft Layers . Auf dieser Website (und ich bin mir sicher auch auf anderen Websites) gibt es eine gute Diskussion über die Vorteile.
quelle
quelle
Skriptänderungen sind einfach bereitzustellen. Beispielsweise können Sie Skripts in einer Datenbank aufbewahren. Dies bedeutet, dass Sie anstelle einer vollständigen binären Neuimplementierung und eines möglichen Neustarts des Dienstes nur eine einzige SQL-UPDATE-Anweisung absetzen und möglicherweise ein Signal an Ihren ausgeführten Dienst senden, um das Skript neu zu laden.
Auch Skriptsprachen sind oft einfach zu verstehen und leicht zu programmieren, sodass Sie für den Großteil des Codes (wenn Sie ein großes RPG verwenden) keine "Hardcore" -Entwickler (die sich mit Speicherverwaltung / Zeigern und Optimierungen auf CPU-Ebene befassen) benötigen. Die Skripte für KI, Zaubersprüche, Gegenstandseffekte und die Welt selbst sind oft größer als der Engine-Code. Skriptsprachen ermöglichen es, sich aufgrund der Garbage Collection (im Falle von Lua) und einer höheren Abstraktionsebene viel mehr auf das 'Was' als auf das 'Wie' zu konzentrieren.
quelle
Ein Szenario, in dem die Skripte nützlich sind, besteht darin, dass unsere Engine durch Plugins / Addons erweiterbar sein soll. Diese Erweiterungen werden in vielen Fällen von nicht professionellen Leuten (wie fortgeschrittenen Spielern und Enthusiasten) erstellt. Skripte sind zu diesem Zweck sicherer und einfacher. Durch die Verwendung von Skripten müssen sie keine Compiler verwenden und sich der Zeiger nicht bewusst sein ...
Ein gutes Beispiel dafür ist das Spiel World of Warcraft. Es hat Tausende von Addons, die von der Community erstellt wurden. Diese Addons werden mit LUA + XML geschrieben.
quelle