Implementieren von Skripts in c++ app
Ich mich bewegen möchte verschiedene Teile meiner app in einfachen Skripten, damit die Menschen, die nicht über eine starke Kenntnisse von c++ in der Lage sein, zu Bearbeiten und zu implementieren verschiedener Funktionen.
Weil es ein Echtzeit-app, die ich brauche, um irgendeine Art von multitasking für diese scripts. Im Idealfall ist es so, dass die c++ - app ruft ein Skript-Funktion, die dann weiter ausgeführt wird (unter dem c++ thread), bis entweder eine pause ein Punkt (Wait(x)), oder es gibt. In dem Falle wartet der Staat muss gespeichert werden, bereit für das script neu gestartet werden, um das nächste mal die app Schleifen nach der Dauer abgelaufen ist.
Des Skripts müssen auch in der Lage sein, zum Aufruf von c++ - Klassen-Methoden, idealerweise unter Verwendung der c++ - Klassen eher als einfache wrapper-Funktionen rund um c++ - Klassen.
Ich nicht wollen, verbringen eine enorme Menge an Zeit, dies auch umzusetzen, so verwenden Sie eine vorhandene Skriptsprache, die bevorzugt um das schreiben meines eigenen. Ich habe gehört, dass Python und Lua integriert werden können in eine c++ - app, aber ich weiß nicht, wie Sie dies tun, um meine Ziele zu erreichen.
- Die Skripte müssen in der Lage sein, zum Aufruf von c++ - Funktionen
- Die Skripte müssen in der Lage sein, auf "pause", wenn bestimmte Funktionen aufgerufen werden (zB. Warten) und neu gestartet werden, wieder durch das c++ - thread
- Muss schnell sein -- das ist für eine Echtzeit-app und es könnte möglicherweise sein, eine Menge von Skripten ausgeführt werden.
Kann ich wohl roll die multitasking-code relativ leicht, sofern die Skripte können gespeichert werden und neu gestartet werden (evtl. durch einen anderen thread auf die ursprüngliche).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie entweder Lua oder Python. Lua ist mehr "leicht" als python. Es hat einen kleineren Speicherbedarf als python hat, und in unserer Erfahrung war leichter zu integrieren (Menschen die Laufleistung an diesem Punkt könnte variieren). Es unterstützt eine Reihe von Skripts gleichzeitig ausführen. Lua, zumindest unterstützt das stoppen/starten von threads in der Art und Weise, die Sie wünschen.
Steigern.python ist ganz nett, aber in meiner (begrenzten) Erfahrung, war es für uns schwierig zu bekommen, kompilieren für unsere verschiedenen Umgebungen und war ziemlich Schwergewicht. Es hat (meiner Meinung nach) den Nachteil, dass Boost. Für manche mag das kein problem sein, aber wenn Sie nicht brauchen, erhöhen (oder es nicht benutzen), Sie sind Einführung eine Tonne von code zu bekommen, zu Steigern.python arbeiten. YMMV.
Gebaut haben wir Lua in apps auf mehreren Plattformen (win32, Xbox360 und PS3). Ich glaube, dass es funktionieren wird auf x64. Den Vorschlag, Luabind ist gut. Wir aufgewickelt schreiben unsere eigene Schnittstelle zwischen den beiden und gleichzeitig nicht zu kompliziert, mit, dass der glue-code sparen Sie eine Menge Zeit und vielleicht auch ärger.
Mit beiden Lösungen, obwohl, Debuggen kann ein Schmerz sein. Wir haben derzeit keine gute Lösung für das Debuggen Lua-Skripte, die eingebettet sind in unsere app. Da wir noch nicht verwendet python in unseren apps kann ich nicht sprechen, welche Werkzeuge zur Verfügung stehen könnten, gibt es, aber vor ein paar Jahren war die Landschaft in etwa die gleichen-schlechten-debugging. Mit scripting-Erweiterung der Funktionalität ist nett, aber bugs in den scripts, kann Probleme verursachen und schwierig sein könnten zu suchen.
Den Lua-code selbst ist eine Art chaotisch, mit zu arbeiten, wenn Sie benötigen, um änderungen vorzunehmen. Wir haben gesehen, Fehler in der Lua codebase selbst, die waren schwer auf die Spur. Ich vermute, dass Boost::Python könnte ähnliche Probleme haben.
Und mit jeder Skript-Sprache, es ist nicht unbedingt eine Lösung für "nicht-Programmierer" um die Funktionalität zu erweitern. Es könnte scheinen, wie es, aber Sie werden wahrscheinlich wind up verbringen einen fairen Betrag von Zeit, die entweder Debuggen von Skripts oder vielleicht auch Lua.
Dass alle gesagt, wir waren sehr zufrieden mit Lua und versandt haben es in zwei spielen. Wir haben derzeit keine Pläne, sich von der Sprache. Alles in allem fanden wir es besser als andere alternativen, die verfügbar waren vor ein paar Jahren. Python (und IronPython) sind andere Entscheidungen, sondern basiert auf Erfahrung, Sie scheinen mehr ungeschickt als Lua. Ich würde lieben, zu hören über andere Erfahrungen, gibt es aber.
Kann ich sehr empfehlen, dass Sie werfen Sie einen Blick auf Luabind. Es macht es sehr einfach zu integrieren Lua in C++ - code und Umgekehrt. Es ist auch möglich, aussetzen ganze C++ - Klassen verwendet werden, in Lua.
Ihre beste Wette ist, zum einbetten von lua (www.lua.org) oder python (www.python.org). Beide sind in der Spiele-Branche und sowohl den Zugang als auch extern "C" Funktionen relativ leicht mit lua mit einer Kantenlänge hier (da die Datentypen sind einfacher zu übersetzen zwischen lua und C). Die Anbindung an C++ - Objekte werden ein bisschen mehr Arbeit auf Ihrem Ende, aber Sie können nachschlagen, wie Sie dies tun, auf Google oder auf lua oder python Diskussionsforen.
Ich hoffe, das hilft!
Können Sie auf jeden Fall tun, was Sie wollen mit Python. Hier sind die docs auf der Einbettung von Python in einer Anwendung. Ich bin mir ziemlich sicher, dass Lua würde auch funktionieren, ich bin nur weniger vertraut.
Du beschreibst kooperative multi-tasking, wo das Skript aufrufen muss, eine Pause-oder Wait-Funktion in regelmäßigen Abständen. Vielleicht eine bessere Lösung wäre, um führen Sie die scripting-Sprache in seinem eigenen thread, und verwenden Sie dann Mutexe oder lock-free queues für die Schnittstellen zwischen der Skriptsprache und dem rest des Programms. So ein buggy script nicht aufrufen Pause() oft genug nicht versehentlich frieren Sie Ihr Programm.
Werfen Sie einen Blick auf die Boost.Python Bibliothek. Es sieht aus wie es sollte ziemlich einfach sein, das zu tun, was Sie wollen.
Werfen Sie einen Blick auf SCHLUCK. Ich habe es verwendet, um eine Schnittstelle mit Python, aber es unterstützt auch viele andere Sprachen.
Eine weitere Stimme für Lua. Es ist klein, es ist schnell, es nicht verbrauchen viel Speicher (für die Spiele, die Ihre beste Wette ist, um zu reservieren, großen Puffer bei der Initialisierung und re-direct alle Lua-Allokationen dort). Wir verwendet, tolua zu erzeugen Bindungen, aber es gibt andere Optionen, die meisten von Ihnen sehr viel kleiner/leichter zu bedienen (IMO) als boost.python.
Als für das Debuggen Lua (wenn Sie diesen Weg gehen), ich habe mit DeCoda, und es hat nicht schlecht gewesen. Es vorgibt, ein IDE, aber sorta nicht auf, aber Sie können befestigen Sie Den debugging-Prozess zu visual studio, und gehen Sie den call-stack auf break-Punkte. Sehr praktisch für das aufspüren dieser Fehler behoben.
Können Sie auch einbetten, C/C++ - Skripte mit Ch. Ich nutze es für ein Spiel Projekt an dem ich arbeite, und es tut gut. Schöne Mischung von macht und Anpassungsfähigkeit.