Python als Skriptsprache in C++-Anwendung

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

Hallo :)

ich bast'le derzeit an einer primitiven Game Engine (2D isometrisches RPG) mit C++ auf Basis von SDL. Mit den Grundlagen (d.h. einem Framework um eine TiledMap zu managen, Objekt zu bewegen oder auch einem ImageManager um Grafiken zu laden und zu rendern usw.) bin ich soweit durch. Parallel habe ich auch ein auf JSON und SDL_net basiertes Netzwerkframework gebastelt. Das ganze soll zum Schluss auf einem Netbook flüssig laufen - tut es bisher auch (d.h. Rendering, Pathfinding, Kollisionserkennung usw.).

Nun überlege ich, ob ich eine Skriptsprache verwende, um Vorgänge im Spiel innerhalb der C++-Anwendung zu implementieren. Als Skriptsprache möchte ich Python verwenden - in dem Zusammenhang habe ich von Boost Python und SWIG gelesen. Mit beiden kann ich afaik Python-Module erstellen, durch die ich meinen bisherigen C++-Code in Python verwenden kann.

Erste Frage: Kann mir jemand etwas zur Performance von Boost Python bzw. SWIG sagen, d.h. hat jemand damit Erfahrung? Ich habe gesehen, dass die FIFE-Engine mit SWIG arbeitet - allerdings läuft selbst das Hauptmenü auf meinem Netbook nicht flüssig. Allerdings habe ich mich nicht weiter mit FIFE beschäftigt - also kp woran das genau liegt. Oder sollte ich mich vom "geskripte" fernhalten?

Zweite Frage: Welche Möglichkeiten habe ich, den Python-Code anschließend in meine C++-Anwendung einzubetten? Wie bereits geschrieben, habe ich ein Netzwerk-Framework gebastelt. Dabei soll die eigentliche Spiellogik (Schadensberechnung bei Kämpfen usw.) zentral auf dem Server stattfinden und alle Clients über das Framework mit dem Server kommunizieren.

Vielleicht hat einer von Euch eine Idee. Die Möglichkeiten Python und C++ zu verbinden erscheinen vielfältig. Und gerade deswegen mangelt es mir an Übersicht :)

LG Glocke
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ob Dir "Geskripte" (ist ja ein furchbares Wort) hilft, hängt davon ab, was Du damit erreichen willst. Die Ausdrucksstärke von Python hilft Dir sicherlich bei der Erstellung von Spielabläufen, Regeln oder auch beim Testen/Ausprobieren in puncto Zeitaufwand. Auf der anderen Seite muss hierfür Python so einbezogen werden, dass die entsprechenden Datentypen und Methoden der Engine bereitgestellt werden, d.h. Du wirst einigen Aufwand in die Wrapper Python <--> C++ stecken müssen.
Zweite Überlegung ist der Produktiveinsatz und die Laufzeit. Wie wahrscheinlich ist es, dass Regeln/Spielabläufe später häufig geändert werden sollen/müssen? Ein Interpreter im Spiel hat natürlich eine Auswirkung auf die Skalierung. Hier hängt es aber wiederum vom konkreten Einsatzszenario ab, ob der Spielfluss negativ beeinträchtig wird. Desweiteren sprichst Du von Server/Client-Architektur, da ist mir jetzt nicht klar, auf welcher Seite Du mit Python liebäugelst.

Prinzipiell kannst Du Python auf zweierlei Arten nutzen: zum Einen - Du schreibst ein Spiel in Python, welches Deine Engine nutzt, d.h. Du bindest die Engine an Python. Das geht z.B. mit SWIG und BoostPython. Serverseitig könnte da aber der GIL zum Spassverderber werden bzw. Dich zwingen, große Teile wiederum in GIL released C/C++-Code auszulagern. Ich hatte mal ein Browserspiel dergestalt entwickelt, wobei die Spielmechanik in C war, Python den HTTP-Server lieferte und das Spiel per ctypes eingebunden war.
Da Du große Teile der Engine schon in C++ vorliegen hast, suchst Du wohl eher eine Möglichkeit, Python in die Engine einzubauen siehe --> http://docs.python.org/2/extending/embedding.html und http://docs.python.org/2/c-api/.
Antworten