lscholz_Scripting Gems 6
Download
Report
Transcript lscholz_Scripting Gems 6
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