Frage

Ich möchte verschiedene Teile meiner App in einfache Skripte bewegen, damit die Menschen, die verschiedene Funktionen nicht über eine starke Kenntnis von c ++ haben können, bearbeiten und implementieren.

Da es sich um eine Echtzeit-Anwendung ist, muss ich eine Art haben, für diese Skripte Multitasking. Ich möchte es im Idealfall so, dass die C ++ Anwendung eine Skript-Funktion aufruft, die dann ausgeführt wird fortgesetzt (unter den C ++ Gewinden), bis entweder eine Pause Punkt (Wait (x)), oder es zurückgibt. Im Fall von dem Wartezustand muß bereit gespeichert werden, um das Skript das nächste Mal der App Schleifen neu gestartet werden, nachdem die Dauer abgelaufen ist.

Die Skripte müssen auch in der Lage sein, c zu nennen ++ Klassenmethoden, idealerweise die C ++ Klassen, anstatt Klar Wrapper-Funktionen um c ++ Klassen.

Ich will nicht eine enorme Menge an Zeit damit verbringen, diese Umsetzung so eine vorhandene Skriptsprache wird bevorzugt, meine eigenen zu schreiben. Ich habe gehört, dass Python und Lua in eine C ++ App integriert werden, aber ich weiß nicht, wie dies zu tun, um meine Ziele zu erreichen.

  • Die Skripte müssen c ++ Funktionen in der Lage zu nennen
  • Die Skripte müssen in der Lage sein, „Pause“, wenn bestimmte Funktionen aufgerufen werden (z. B. Warten) und wieder durch die c wieder gestartet werden ++ Thread
  • Anforderungen schnell sein - das ist für eine Echtzeit-App und es könnte möglicherweise viele Skripte ausgeführt werden
  • .

Ich kann wahrscheinlich den Multitasking-Code ziemlich leicht rollen, vorausgesetzt, kann die Skripte (möglicherweise auf das Original von einem anderen Thread) gespeichert und neu gestartet werden.

War es hilfreich?

Lösung

Sie können entweder Lua oder Python verwenden. Lua ist mehr „leichte“ als Python. Es ist einen kleinen Speicherbedarf bekommt als Python tut und in unserer Erfahrung war leichter zu integrieren (Volk Kilometer in diesem Punkt können variieren). Es kann eine Reihe von Skripten unterstützt gleichzeitig ausgeführt werden. Lua zumindest unterstützt Anhalten / Threads in der Art und Weise beginnen Sie wünschen.

Boost.Python ist schön, aber in meiner (begrenzten) Erfahrung, war es schwierig für uns, für unsere verschiedene Umgebungen zu erhalten Kompilieren und war ziemlich Schwergewicht. Es hat (meiner Meinung nach) den Nachteil Erhöhung erforderlich machen könnte. Für einige, die vielleicht kein Problem, aber wenn Sie nicht-Boost brauchen (oder es nicht verwenden), stellen Sie eine Tonne von Code zu bekommen Boost.Python arbeiten. YMMV.

Wir haben Lua in Apps auf mehreren Plattformen (win32, Xbox360 und PS3) gebaut. Ich glaube, dass es auf x64 funktionieren. Der Vorschlag Luabind zu verwenden ist gut. Wir haben dann unsere eigene Schnittstelle zwischen den beiden zu schreiben und zwar nicht zu kompliziert, dass Leim Code finden Sie eine Menge Zeit sparen und vielleicht Ärger.

Mit jeder Lösung aber kann das Debuggen ein Schmerz sein. Wir haben derzeit keine gute Lösung für das Debuggen von Lua-Skripten, die in unsere App eingebettet sind. Da wir nicht Python in unsere Anwendungen verwendet haben, können spreche ich nicht, welche Werkzeuge es verfügbar sein könnten, aber ein paar Jahren war die Landschaft in etwa gleich - schlecht Debuggen. Mit Scripting-Funktionalität ist schön zu verlängern, aber Fehler in den Skripten können zu Problemen führen und könnte schwierig sein, ausfindig zu machen.

Der Lua-Code selbst ist eine Art chaotisch, mit zu arbeiten, wenn Sie dort Änderungen vornehmen müssen. Wir haben Fehler in der Lua Code-Basis selbst gesehen, die auf die Spur zu hart waren. Ich vermute, dass boost :: Python könnte ähnliche Probleme haben.

Und mit jeder Skriptsprache, es ist nicht unbedingt eine Lösung für „Nicht-Programmierer“ Funktionalität zu erweitern. Es mag wie es scheint, aber Sie werden winden wahrscheinlich eine Menge Zeit verbringen bis entweder das Debuggen von Skripts oder sogar vielleicht Lua.

Das alles gesagt, wir haben mit Lua sehr zufrieden und haben es in zwei Spielen ausgeliefert. Wir haben derzeit keine Pläne aus der Sprache weg zu bewegen. Vor Alles in allem haben wir es besser als andere Alternativen gefunden, die ein paar Jahre zur Verfügung standen. Python (und Ironpython) sind weitere Möglichkeiten, aber auf Grund der Erfahrungen, sie scheinen mehr plump als Lua. Ich würde gerne über andere Erfahrungen zu hören, es aber.

Andere Tipps

Ich kann empfehlen, dass Sie einen Blick auf Luabind . Es macht es sehr einfach Lua in C ++ Code und umgekehrt zu integrieren. Es ist auch möglich, ganze C ++ Klassen zu belichten in Lua verwendet werden.

Ihre beste Wette ist entweder lua (www.lua.org) oder Python (www.python.org) einzubetten. Beide sind in der Spieleindustrie und beide Zugang extern „C“ Funktionen relativ einfach mit lua mit einer Kante hier (weil Datentypen sind leichter zu übersetzen zwischen lua und C) eingesetzt. Die Anbindung an C ++ Objekten wird ein bisschen mehr Arbeit auf Ihrer Seite sein, aber man kann sehen, wie diese auf Google zu tun, oder auf lua oder Python Diskussionsforen.

Ich hoffe, das hilft!

Sie können auf jeden Fall tun, was Sie mit Python wollen. Hier sind die docs Python in eine Anwendung auf das Einbetten. Ich bin ziemlich sicher, Lua würde arbeiten, ich bin nur weniger vertraut.

Sie beschreiben kooperativen Multi-Tasking, wo das Skript eine Pause aufrufen muss oder Funktion in regelmäßigen Abständen warten. Vielleicht eine bessere Lösung wäre, die Skriptsprache in einem eigenen Thread läuft, und dann Mutexe oder Lock-freien Warteschlangen für die Schnittstellen zwischen der Skriptsprache und dem Rest des Programms verwenden. Auf diese Weise ein Buggy-Skript, das nicht bricht () aufrufen, oft genug kann das Programm nicht versehentlich einfrieren.

Schauen Sie sich die Boost.Python Bibliothek. Es sieht aus wie sollte es recht einfach sein, zu tun, was Sie wollen.

Hier finden Sie aktuelle SWIG . Ich habe es verwendet, um mit Python-Schnittstelle, aber es unterstützt viele andere Sprachen.

Eine weitere Stimme für Lua. Es ist klein, es ist schnell, tut es viel Speicher verbrauchen (für Spiele die beste Wahl große Puffer bei der Initialisierung und umlenken alle Lua Speicherzuordnungen dort zuzuordnen ist). Wir verwendeten tolua Bindungen zu erzeugen, aber es gibt andere Optionen, die meisten von ihnen viel kleiner / leichter zu bedienen (IMO) als boost.python.

Wie zum Debuggen von Lua (wenn Sie diesen Weg gehen), ich habe DeCoda benutzen, und es ist nicht schlecht. Es gibt vor, eine IDE zu sein, doch irgendwie sorta das an, aber Sie können den Debug-Prozess zu Visual Studio befestigen und den Call-Stack an Bruchstellen nach unten gehen. Sehr praktisch für das Aufspüren dieser Fehler.

Sie können auch einbetten C / C ++ Skripte mit Ch . Ich habe mit ihm für ein Spiel Projekt arbeite ich, und es tut gut. Schöne Mischung aus Kraft und Anpassungsfähigkeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top