Softwaretechnologie II (Teil 2): Simulation und 3D Programmierung Manfred Thaller SS 2013 Scripting Gems 6 Linda Scholz Scripting Language Survey Beliebte Tools zur Spieleprogrammierung Steuerung animierter Sequenzen Merkmale der NPC´s Verhalten der AI-kontrollierten Helfer Ermöglicht frühe Prototypen des Spiels Vereinfacht die Teamarbeit Scripting Language Survey Python Lua GameMonkey AngelScript Language Coding Universal Features Ähnliche Charakteristiken Flexibilität – Möglichkeit den Code während des laufenden Spiels zu verändern Automatisiertes Memory Management Einfache Bedienung Language Coding Unterschiede AngelScript – fixed typed language Variablen werden für ihren Nutzen benötigt Lua/Pyhton/GameMonkey – dynamic typed language Werte verschiedener Typen können verarbeitet werden Werte werden bei der Zuweisung erzeugt Lokale und globale Variablen müssen deklariert werden Language Coding Unterschiede Python Lua / GameMonkey Größte Auswahl dynamischer Strukturen Nutzen Tables, um Container und Objekte zu implementieren oder Klassen zu simulieren AngelScript Nutzt dynamische Arrays Integration with C/C++ Python Daten- und Funktionalitätsaustausch möglich Python-Funktionen können die Werte in C++ erstellen und C++ callbacks registrieren Standard Phyton mit C++ zu verbinden ist kompliziert und führt oft zu Fehlern AngelScript Teilt die Abruf-Konventionen mit C++ Es werden keine zusätzlichen Funktionen / Modifikationen benötigt Integration with C/C++ Lua Infomationsaustausch zwischen Lua und C++ ist durch einen virtual stack geregelt Für jede Funktionsabfrage wird ein neuer stack angelegt GameMonkey Einfache Integration mit C++ Beschränkte objektorientierte Programmierung – keine Funktionsüberladungen, Klassen-Vererbung oder Polymorphismus Integration with C/C++ Kompletter Zugriff auf globale Variablen ist möglich in Lua, AngelScript und GameMonkey Lua / GameMonkey nutzen globale tables AngelScript nutzt Funktionen um pointer zu einer globalen Variable abzufragen In Python können globale Konstanten von C++ aufgerufen werden Integration with C/C++ Durch C++ ist es möglich Script Funktionen abzurufen Python Alle Parameter müssen zu Python Objekten konvertiert und in ein tuple gruppiert werden Ein Wert wird zurückgegeben, aber es kann ein tuple sein, der verschiedene Werte enthält Integration with C/C++ Lua Parameter werden in einem stack gelagert Mehrere Werte können in einem stack zurückgegeben werden AngelScript / GameMonkey Parameter werden zu Helfer-Klassen hinzugefügt und mit dem Namen der Funktion initialisiert Ein Wert wird der Helfer-Klasse zurückgeliefert Integration with C/C++ Binding tools werden benötigt, um Klassen zu C++ zu exportieren AngelScript Einfacher Export durch Aufruf der API GameMonkey Binding tool ist noch in der Entwicklung Integration with C/C++ Python – Swig Interface file – beschreibt alle C++ Features Output source files in C++ und Python Generiert Schatten Klassen in Python aus C++ Klassen Vererbungshierarchie und Überladen von Funktionen ist möglich Integration with C/C++ Python – Boost.Python C++ Klassen werden mit Python ähnlicher Syntax geschrieben Konstruktoren mit Parametern werden als Eigenschaften exportiert, die Python als public data members sieht Die Boost.Python Bibliothek hilft bei der Integration von Klassen- und Vererbungsstrukturen, Funktionsüberladung und –operatoren, Iteratoren und Objekt Interface von C++ zu Python Integration with C/C++ Lua – ToLua++ Enthält input header files und outputs die das Einbinden implementieren Header files können dem input package zugefügt werden Klassen können einfach exportiert werden Die Klassen können in Lua mit Vererbung und Polymorphismus genutzt werden Überladene Funktionen und Operatoren werden als Teil der Klasse unterstützt Integration with C/C++ Lua – LuaPlus Durch Modifikation kann C++ integriert werden Unterstützt keine cross-language Vererbung oder Funktionsüberladung C++ Programmierer können Lua vereinfacht initialisieren, mit dem stack operieren und globale Variablen abrufen (LuaState) C++ Programmierer können Objekte unabhängig vom stack nutzen (LuaObject) Performance Features Memory Management Speicher verteilen, Speicher freigeben, Lücken schließen Reference Counting Prüft ob Objekte noch gebraucht werden durch Referenzen zu anderen Objekten Solange Objekte zu anderen Referenzen haben werden sie nicht freigegeben (Reference Cycles) Performance Features Garbage Collection Objekte werden durch Hierarchien festgelegt Root Elemente lagern Referenzen zu anderen Objekten, die markiert werden Nicht mehr benötigte Objekte werden aus der Hierarchie gelöscht Unmarkierte Objekte werden entsorgt (mark and sweep) Garbage Collection Durchläufe brauchen viel Zeit Incremental Garbage Collection führt die Operation über mehrere Frames aus Performance Features Custom Memory Manager Belegt und befreit geschützten Speicher unabhängig vom System Profiling Profile(Python): Erlaubt Lagerung von Profildaten über die Ausführung einer laufenden Funktion LuaProfiler(Lua): Man erhält ein Protokoll über Funktionsaufrufe und verbrauchter Zeit Development Support Features Multithreading Durch Klassen wird ein Multithread-System simuliert Generators in Python – nicht komplett thread-safe Coroutines in Lua GameMonkey hat ein umfangreichen thread support – Ausführungen können geblockt oder angehalten werden bis sie ein Event wieder aktiviert Development Support Features Debugging Facilities Wichtiges Tool zur Fehlersuche im Script Python: Logging package – hilft bei debugging Problemen Pdb module: Unterstützt das Setzen von Breakpoints, Wechseln zwischen Code & Untersuchen von stack frames Lua Keine built-in debugging tools Helfer-Funktionen für Informationen über die Laufzeit, Verhalten von Funktionen und Funktionsaufrufe Development Support Features Debugging Facilities GameMonkey: Funktion um Breakpoints zu setzen und Prüfen ob Bedingungen wahr sind Zusätzlich können Rückruffunktionen unter bestimmten Bedingungen aufgerufen werden AngelScript Für jede Ausführung kann eine Rückruffunktion aufgerufen werden Untersuchen von Variablenwerten wird in Zukunft möglich sein Conclusion Verschiedene Scripting Languages bieten verschiedene Funktionen Spielentwickler können sich eine passende Sprache aussuchen Möglichkeit verschiedene Sprachen zu kombinieren und Features zu integrieren steht hierbei im Mittelpunkt Exposing Actor Propeties Using Nonintrusive Proxies Actor ActorProxy Objekte in der Spielwelt egal ob statisch oder dynamisch Datenorientierte Klasse, die jede Actor-Klasse umhüllt und die Eigenschaften kennt Enthält allgemeine Tools, die Level-Editor oder Game-Manager aufrufen und manipulieren können ActorProperty Informationen über einzelne Eigenschaften Nonintrusive and Dynamic Architecture ActorProxies werden benötigt um praktische Arbeit zwischen verschiedenen Teammitgliedern zu gewährleisten Proxies bieten eine nicht berührungsfreie Architektur, die die Funktionen des Grundobjekts nicht verändern Gefahr existierenden Code zu zerstören ist gebannt Nonintrusive and Dynamic Architecture ActorProperty ist dynamisch und beeinflusst nicht die Laufzeit Man kann Objekte verändern ohne die Basis zu zerstören ActorProperty Functors Getter Methode zum Wiederherstellen von Daten Setter Methode zum Zuweisen von Daten Functors (function objects) sind ein C++ Mechanismus um den call-back function pointer zu erreichen getter und setter Functors müssen in die Basisklasse integriert werden Unterklassen können so die Typen SetType und GetType definieren Property Design GenericActorProperty Klasse dient als Basis und enthält die Metadaten Unterklassen für jeden Eigenschaftstyp werden benötigt, um die verschieden Typen wie integers, floats, textures oder sounds zu unterstützen ActorProxies • Jedes Proxy konstruiert eine Liste der Eigenschaften der Klasse mit jeweiliger getter und setter Methode • Jedes Proxy hat eine Referenz zum zugrunde liegenden Objekt, wodurch tools direkt das Proxy nutzen können ActorProxies • Initialisierte Proxies liefern eine einheitliche Schicht des Objektverhaltens, die universell genutzt werden kann - bspw. zur Objekterzeugung • Man hat komplette Kontrolle über die Objekteigenschaften Conclusion • Teamarbeit ist gewährleistet und verschiedene Teammitglieder mit verschiedenen Aufgaben können Objekte für sich bearbeiten ohne das Grundobjekt zu zerstören • Zugrundeliegende Objekte können wiederverwendet werden