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