Seminar Game Development Engines and Middleware
Transcription
Seminar Game Development Engines and Middleware
Seminar Game Development Engines and Middleware Robert Krause 1005528 12. Juni 2007 Aufgabensteller: Prof. Dr. Uwe Borghoff Betreuer: Dipl.-Inform. Daniel Volk Institut für Softwaretechnologie Fakultät für Informatik Universität der Bundeswehr München INHALTSVERZEICHNIS 3 Inhaltsverzeichnis 1 Einleitung 5 2 Entwicklungsprozess 7 2.1 Wiederverwendung . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3 Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3 Aufbau und Architektur einer Game-Engine 11 3.1 Typisierung und Kategorisierung . . . . . . . . . . . . . . . . 11 3.2 Arbeitsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.3 Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4 Besonderheiten im Spieleentwicklungsprozess 17 4.1 Engineauswahl . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.2 Engine-Skripting . . . . . . . . . . . . . . . . . . . . . . . . . 19 4.3 Cross-Platform-Development . . . . . . . . . . . . . . . . . . 20 5 Ausblick 21 4 INHALTSVERZEICHNIS 5 1 Einleitung Aus einem langen Entwicklungsprozess entstanden und von den großen Gedanken der Wiederverwendung und Abstraktion getragen, sind Engines und Middleware heutzutage nicht mehr aus dem Bereich der Softwareentwicklung, insbesondere der Spieleentwicklung, wegzudenken. Engines und Middleware nehmen Spieleherstellern einen großen Teil doppelter Arbeit ab, da auf bereits programmierten Quellcode zurückgegriffen wird und bieten durch eine geschickte Softwarearchitektur den Spieledesignern die Möglichkeit sich auf den wesentlichen, kreativen Anteil zu konzentrieren, auch ohne technisches Fachwissen über Computer besitzen zu müssen. Selbst durch unbezahlte Hobbyprogrammierer entstehen und verbessen sich inzwischen fortlaufend frei erhältliche Softwareprodukte, bei denen der Quellcode offen liegt und die ihren kommerziellen Konkurrenzprodukten in nichts nachstehen. Diese Seminararbeit soll die Entstehung, den Aufbau und die Integration von Engines und Middleware mit Bezug auf den Spieleentwicklungsprozess behandeln. Dazu soll zunächst von der allgemeinen Softwareentwicklung ausgegangen und die Motivation zur Entwicklung der Engines und Middleware beschrieben werden. Im Anschluss wird die Funktionsweise und Architektur der Spiele-Engines erklärt und das Vorgehen eines Spieleherstellers während der Entwicklung eines Computerspiels näher beschrieben. Als Teil des Seminars ”Game Development” ist diese Seminararbeit in Zusammenhang mit weiteren Seminararbeiten zu sehen, deren Inhalt gegenbebenfalls als Wissen vorausgesetzt werden kann. Entstanden ist sie nach einer mehrwöchigen Phase der Literaturstudie, bei der auffallend war, dass jede Quelle Game-Engines und Game-Middleware unterschiedlich beschreibt und es keine feste, wissenschaftliche Definition dazu zu geben scheint. Deshalb habe ich versucht, die für mich treffendste Beschreibung zu finden und eine klare Abgrenzung zu erarbeiten, die beim fortlaufenden Lesen erkenntlich werden sollte. 6 1 EINLEITUNG 7 2 Entwicklungsprozess Im Folgenden soll zunächst auf die Entwicklung von Middleware und Engines und den Grundgedanken der Wiederverwendung eingegangen werden. 2.1 Wiederverwendung Software wurde früher von Teams aus wenigen erfahrenen Programmierern entwickelt. Diese mussten detailiertes Wissen über Hardware und Betriebssystem besitzen und erstellten Programme ”aus einem Guss” mit fest im Quelltext verdrahteten Funktionalitäten. Wenn nun neue, ähnliche Software entwickelt oder bestimmte Leistungsmerkmale vorhandener Software übernommen werden sollte, wurde mit der Programmierung immer wieder bei Null angefangen - ”das Rad wurde neu erfunden”. Im Rahmen wachsender Software-Komplexität und steigender Qualitätsansprüche erkannte man die Notwendigkeit einer grundlegenden Änderung in der Software-Entwicklung. So wurde im Jahr 1967 der Begriff des ”Software Engineering” als ein Teilgebiet der Informatik ins Leben gerufen, das unter anderem das Gebiet der ”Software-Wiederverwendung” umfasste. Die Idee ist, ”gewonnene Ergebnisse und Erfahrungen aus vorhergegangenen Software-Projekten in neuen Projekten wiederzuverwenden und so schrittweise systematisch zu verbessern” [Bec96, S. 9]. Um vorhandenen Problemen wie • schwer absehbarer Entwicklungszeit und Entwicklungskosten • mangelnder Qualität wegen ständiger Neuentwicklung • schlechte Überschaubarkeit bei größeren Projekten • Bedarf an Expertenwissen über Hardware und Betriebssystem zu entgehen, entwickelte man Methoden wie • Quelltextgeneratoren • Bibliotheken und Toolkits • Frameworks , auf die ich im Folgenden noch etwas genauer eingehen möchte. 8 2 ENTWICKLUNGSPROZESS Quelltextgeneratoren Quelltextgeneratoren stellen einen ersten Schritt in Richtung Wiederverwendung dar. Sie beruhen auf dem Ansatz des ”Copy&Paste”1 und erzeugen nach Vorgabe bestimmter Spezifikationen Quelltext für einen bestimmten Anwendungsbereich. Die Idee ist, Quelltext, der im Großteil für ähnliche Aufgaben gleich bleibt, zusammen zu fassen und nur die Abweichungen im Generator zu definieren. Als Beispiel kann man sich das Öffnen einer Datei vorstellen. Der Quelltextgenerator erzeugt hier den nötigen Code um das Betriebssystem bzw. die Hardware die Datei öffnen zu lassen, der ja bei jedem Dateiöffnungsprozess identisch ist. Dynamische Anteile wie zum Beispiel der Dateiname werden im Generator angegeben und dann automatisch im Quelltext eingebettet. Bibliotheken und Toolkits Fasst man den oft verwendeten und jedes mal fast identischen Quelltext nun in Blöcke zusammen und kapselt sie vom eigentlichen Programm ab (Modularisierung), so entstehen Bibliotheken und Toolkits. Allgemein kann sie als ”Sammlungen programmiersprachlicher Module, Klassen, Funktionen und Methoden, die gemeinsam eine Basisfunktionalität bereitstellen” [Lin99, S. 53], bezeichnen. Bibliotheken schaffen Transparenz, da sie zugrunde liegende Funktionalitäten verbergen und bieten so Programmierern die Möglichkeit, bereits vorhanden Quellcode mittels klar definierter Schnittstellen in ihre Programme einzubinden. Im genannten Beispiel muss der Programmierer, um eine Datei zu öffnen, nur noch eine Funktion einer Bibliothek aufrufen und den gewünschten Dateinamen übergeben. Frameworks Während Bibliotheken mit ihren Funktionen einen thematisch abgegeschlossenen Bereich (zum Beispiel Dateioperationen) abdecken, stellt ein Framework schon das Grundgerüst eines kompletten Programms bereit. Das heißt, Frameworks schreiben die Architektur einer Anwendung und damit einen festen Ablauf vor und sind somit meist für einen bestimmten Anwendungstyp konzipiert. Da ein Framework eine feste Struktur besitzt, braucht der Programmierer nur noch seine Funktionen einzubetten um es wie gewünscht zu spezialisieren. Ein Beispiel für Frameworks sind elektronische Warenhäuser im Internet, bei denen bereits komplette Routinen der Datenverwaltung, Darstellung und Kaufabwicklung implementiert sind und der Programmierer nur noch gewünschte Anpassungen und Erweiterungen vornehmen braucht. 1 Kopieren und Einfügen 2.2 Middleware 2.2 9 Middleware Auf dem Weg zur Entwicklung von Engines liegt neben Wiederverwendung in hohem Maße auch das Prinzip der Abstraktion, das nun anhand von Middleware behandelt werden soll. Direkt übersetzt bedeutet der Begriff ”Middleware” so etwas wie ”Zwischenware”, das heißt, ein Produkt, das zwischen etwas steht. Entstanden ist sie aus zwei Beweggründen: • Software wurde größtenteils unabhängig voneinander entwickelt und bot keine Möglichkeit der Interoperabilität mit anderer Software • Anwendungen wurden für eine Plattform entwickelt und waren inkompatibel zu anderen Betriebsystemen oder Hardwarearchitekturen Also kam die Idee eines Produkts auf, das zwischen andere Programme ”geschaltet” werden kann, um diese zu verbinden und Daten austauschen zu lassen. Diese Produkte bezeichnen wir heute als ”Middleware”. Zusammenfassend kann man sie als ”anwendungsunabhängige Technologie, die Dienstleistungen zur Vermittlung zwischen Anwendungen anbietet, so dass die Komplexität der zugrundeliegenden Applikationen und Infrastruktur verborgen wird” [Ruh01] bezeichnen. Abbildung 1: Middleware zwischen Anwendungen So können Programme, die auf Middleware oder den Output von Middleware zugreifen, die Daten in gewohnter Art und Weise interpretieren und brauchen sich nicht um eventuelle Konvertierungen kümmern (Abb. 1). Abbildung 2: Middleware zwischen Spiel und Plattform Game-Middleware ist oft als Application Programming Interface (API) zu verstehen (hier: DirectX), um eine Abstraktion zur Systemplattform zu schaffen und Spielen so die Möglichkeit zu geben, über einheitliche StandardSchnittstellen die Hardware zu steuern (Abb. 2) - eine Schichtenarchitektur entsteht. 10 2.3 2 ENTWICKLUNGSPROZESS Engine Nachdem mit Middleware eine Abstraktion zur Hardware geschaffen wurde, soll nun durch Engines eine weitere Abstraktionsebene entstehen. Der Begriff Engine stammt aus dem Englischen und bezeichnet einen Motor oder eine Maschine. Diese Übersetzung deutet bereits eine eher technische Beziehung an und genau das stellt die Engine in zweierlei Hinsicht dar. Zum einen nimmt sie die Aufgaben des ”Motors” innerhalb einer Software wahr und übernimmt als die antreibende Kraft die Verwaltung zentraler Aufgaben, ohne die das Programm nicht funktionieren würde. Zum anderen wird versucht durch die Engine eine Abkapselung der zugrunde liegenen Technik vom eigentlichen Inhalt der Software zu erreichen. Während bei Frameworks der Entwickler seinen Inhalt noch als Quellcode in das Framework einbetten musste (White Box), bieten Engines Schnittstellen in Form von Editoren, Tools und Skripting um den Inhalt in die Anwendung oder das Spiel zu integrieren. Die Notwendigkeit eigener Programmierarbeit im Engine-Quellcode, entfällt hierbei (Black Box). Durch das Zusammenfassen bestimmter anwendungsspezifischer Funktionalitäten, sind Engines, genau wie Frameworks, für jeweils einen bestimmten Anwendungstyp konzipiert (beispielsweise Datenbank- oder Grafik-Engines). Abbildung 3: Einordnung der Engine zwischen Anwendung und Hardware Abbildung 3 zeigt die Aufteilung der Anwendung in Inhalt und Engine, was eine neue Abstraktionsebene erzeugt. Während vorher noch eine reine Abstraktion zur Hardware mittels Middleware statt fand, wird nun die gesamte Behandlung des Inhalts abstrahiert. Auf diese Art und Weise kann der Anwendungsentwickler seiner eigentlichen Aufgabe der Entwicklung des Softwareinhalts nachkommen und braucht sich nicht jedes Mal mit der technischen Umsetzung auseinander zu setzen. 11 3 Aufbau und Architektur einer Game-Engine Im vorangegangen Kapitel haben wir gesehen, worum es sich bei einer Engine handelt. Eine Spiel- oder Game-Engine bezeichnet nun die Engine und damit wiederum antreibende Kraft - das Kernstück - innerhalb eines Computerspiels. Das Ziel bleibt gleich: eine Trennung zwischen Daten (Spielinhalt) und zugrunde liegender Technik, also der Umsetzung des Inhalts für den Spieler, zu schaffen. 3.1 Typisierung und Kategorisierung Um ein Spiel interessant zu gestalten, bedarf es mehr als nur einiger animierter Bilder, unter anderem Sound, Künstlicher Intelligenz (KI) und Netzwerkunterstützung. Da eine Spiel-Engine, die all diese Funktionalitäten umfasst, schnell unübersichtlich werden würde und die Wartbarkeit erschwert, werden Game-Engines im Allgemeinen modularisiert. Abbildung 4: Modularisierung der Game-Engine Dazu stehen alle Module, die hier ebenfalls als (Teil-)Engine bezeichnet werden und für sich einen speziellen technischen Teilbereich des Spiels behandeln, in ständiger Kommunikation mit dem Game-Engine-Kern, der die gesamte Ablaufsteuerung übernimmt (Abbildung 4). Da Computerspiele von der Interaktion und Dynamik des Spielers leben, können nicht alle Handlungen und Abläufe fest programmiert werden, sondern müssen während des Spielens simuliert werden. Deshalb fasst man die Aufgaben der Physik- und KI-Engine oft zum Bereich der Simulation zusammen. Bevor die Arbeitsweise der Game-Engine mit besonderem Augenmerk auf den Engine-Kern (und der enthaltenen Spiel-Hauptschleife) beschrieben werden, sollen zunächst die hier dargestellten wichtige Teil-Engines näher erläutert werden. 12 3 AUFBAU UND ARCHITEKTUR EINER GAME-ENGINE Grafik-Engine Die Grafik-Engine ist für die gesamte Visualisierung auf dem Bildschirm zuständig. Nach [Wik07c] bietet sie ”einem Programmierer eine große Palette von grafischen Funktionen und Effekten (geometrische Objektbeschreibung, Oberflächentexturen, Licht und Schatten, Transparenz, Spiegelungen usw.), so dass er für seine spezielle Anwendung diese nicht stets neuprogrammieren muss”. Unterteilt wird die Grafik-Engine meist in einen Teil zur Echtzeitberechnung und -darstellung der Spieldaten (wie Level, Charaktere, usw.) auf dem Bildschirm, dem sogenannten ”Renderer” und in einen Teil, der die grafische Benutzerschnittstelle, das sogenannte ”Graphical User Interface” (GUI) erzeugt. Nähere Informationen über Grafik in Computerspielen finden sich in der Seminararbeit ”Computer Game Graphics”. Sound-Engine Für Sound-Effekte, Hintergrundmusik und anderweitige akkustische Ausgabe ist die sogenannte Sound-Engine zuständig. Ähnlich wie die GrafikEngine bietet sie dem Programmierer Funktionen und Effekte um Töne und erstellte Soundtracks auszugeben und mit zum Beispiel Echos oder Rauschen zu modifizieren. Heutzutage sind Sound-Engines sogar in der Lage, speziell angefertigte 3D-Sounds auf 5.1- oder 7.1-Surroundsysteme auszugeben. Physik-Engine Physik-Engines dienen der Simulation und Berechnung physikalischer Abläufe wie zum Beispiel von Flugbahnen oder dem Aufeinanderprallen von Körpern. Dabei geht es weniger um korrekte physikalische (realitätsnahe) Umsetzung, sondern aus Gründen der Effizienz und des Spielspasses mehr um die Anwendung physikalischer und mathematischer Gesetzmäßigkeiten mit variablen, vom Programmierer zu bestimmender, Natur-”Konstanten”. Unter anderem ist die Physik-Engine auch für den wichtigen Teilbereich der Kollisionserkennung zuständig. Hierbei wird in periodischen Abständen geprüft, ob die Figuren des Spiels andere Gegenstände der Spielwelt schneiden und dann ein Hindernis simuliert, sodass Spielfiguren nicht durch Wände oder Gegenstände hindurch laufen können. Die Anwendung von Physik in Computerspielen, aber auch anderen Anwendungen, geht so weit, dass mittlerweile sogar speziell für physikalische Berechnungen optimierte Hardwarelösungen in Form von Physikkarten oder Physikchips auf Grafikkarten existieren. 3.1 Typisierung und Kategorisierung 13 Netzwerk-Engine Die Netzwerk-Engine ist für die gesamte Kommunikation eines Spiels im Netzwerk zuständig. Bei jedem Spiel endet irgendwann der von den Entwicklern vorgesehene Spielverlauf in Form von Missionen oder Kampagnen. Um dem damit schwindenden Spielspass entgegen zu wirken, beinhalten viele Spiele eine Mehrspielerfähigkeit (Multiplayer) wodurch Spieler gegeneinander oder miteinander antreten können. Zur Unterstützung übernimmt die Netzwerk-Engine die Verwaltung der Multiplayer-Umgebung und bietet dem Programmierer die Möglichkeit, diese mit einfachen Mitteln durch vorgefertigte Funktionen in sein Spiel einzubauen. KI-Engine Die gesamte Abarbeitung der künstlichen Intelligenz in Computerspielen wird in der Künstlichen Intelligenz Engine (KI-Engine) realisiert. Dem Programmierer wird hier durch vorgefertigte Funktionen die Möglichkeit gegeben, seine Spielfiguren mit einer Art Intelligenz zu versehen. Hierzu werden KI-Regeln (Wenn-Dann-Regeln) erstellt, die zu KI-Skripten zusammen gefasst werden und in periodischen Abständen im Spiel abgearbeitet und geprüft werden. Dazu gehört sowohl die Art der KI, wie sie Schachcomputer haben um Probleme zu lösen, als auch die sogenannte Pfadsuche, wobei Figuren selbstständig Wege zwischen Orten im Spiel finden müssen. Die Entwicklung der Künstlichen Intelligenz geht sogar dahin, dass Figuren innerhalb eines Spiels miteinander kommunizieren um taktische Absprachen zu treffen oder sich auf die Spielweise des Gegners einstellen. Ich möchte an dieser Stelle auf die Seminararbeit ”Artificial Intelligence in Computer Games” verweisen, die sich noch eingehender mit dem Thema der künstlichen Intelligenz auseinandersetzt. Skripting-Engine Skriptsprachen bieten dem Programmierer die Möglichkeit, Spielabläufe und Spiellogik auf eine abstrahierte Art zu beschreiben. Die Skript-Engine übernimmt hierbei, zur Laufzeit des Spiels, die Überprüfung und Auslösung der in der Skriptsprache definierten Aktionen und Handlungen. Sie unterstützt den Programmierer dahingehend, dass keine Abläufe mehr in ”echten” Programmiersprachen wie beispielsweise C++ geschrieben werden müssen, sondern alles was in der Spielwelt passieren kann über die Skript-Engine und die zugrunde liegende Skriptsprache realisiert werden kann. Detailiertere Informationen zur Skript-Engine und dem Engine-Skripting sind im Kapitel 4.2 zu finden. 14 3 AUFBAU UND ARCHITEKTUR EINER GAME-ENGINE 3.2 Arbeitsweise Nachdem nun die üblichen Bestandteile einer Game-Engine bekannt sind, soll erklärt werden, wie diese zusammen wirken und wie die Game-Engine, insbesondere der Engine-Kern, arbeitet. In Abbildung 4 (Kapitel 3.1) war bereits die Unterteilung einer Spiele-Engine zu sehen und der zentrale Teil, der Spiel-Engine-Kern, zu erkennen. Die gesamte Aufgabenverteilung und Steuerung der Engine und des Spiels als Ganzes geschieht im Engine-Kern. Beim Starten eines Computerspiels hat die Engine, genauer gesagt der EngineKern, zunächst die Aufgabe eine Grundkonfiguration des Spiels herzustellen. Dazu gehört das Einlesen und Verarbeiten der Konfigurationsdateien und gegebenenfalls übergebener Startparameter sowie die Initalisierung der TeilEngines und die Darstellung eines Spielmenüs. Alle Handlungen, die der Spieler im Menü vornimmt, werden an den EngineKern weitergeleitet, der dann die durchzuführenden Befehle wie Änderungen der Optionen, Laden eines Levels oder Beenden des Spiels an die in der Game-Engine vorhandenen Teil-Engines weiter leitet. Hat sich ein Spieler dafür entschieden das eigentliche Spiel zu starten oder fortzusetzen, leitet der Engine-Kern alle nötigen Maßnahmen ein und kommuniziert mit den Teil-Engines. Um die stetigen Veränderungen der Spielwelt darzustellen und auf Interaktionen des Spieler eingehen zu können, führt die Engine in periodischen Abständen Überprüfungen und damit verbunden, Änderungen der Spielwelt durch. All diese Aktionen zur Aktualisierung und Darstellung des Spielinhalt werden in der sogenannten Hauptschleife (Game Main Loop) als Teil des Engine-Kerns zusammen gefasst. Nach [Kna06], [Fei06] und [Dam02] finden bei jedem Durchlauf der Hauptschleife folgende Aktionen statt: 1. Eingaben des Spielers (wie Mausbewegungen oder Tastendrücke) einlesen, interpretieren und daraus neue Befehle für die Spielwelt erstellen 2. KI-Engine nimmt aktuelle Lage wahr und berechnet daraus mittels KI-Regeln Änderungen für Figuren und Gegenstände des Spiels 3. Aufgrund der Änderungen durch Spieler und KI werden Spielfiguren und Gegenstände bewegt und animiert 4. Physik-Engine stellt sicher, dass alle Bewegungen entsprechend der vorgegebenen Physik korrekt ablaufen und überprüft, ob durch Bewegungen Kollisionen entstanden sind, um diese entsprechend aufzulösen 3.3 Architektur 15 5. Sound-Engine überprüft, ob durch Änderungen der Spielwelt neue Geräusche oder Soundtracks abgespielt werden müssen 6. Grafik-Engine erstellt aus dem Blickpunkt des Spielers ein neues Bild auf die aktuelle Spielwelt Die Abläufe in der Hauptschleife werden meist in Eingabe (Punkt 1 und 2), Simulation (Punkt 3 und 4) und Ausgabe (Punkt 5 und 6) unterteilt. Durch schnelle, wiederholte Durchläufe dieser Ablaufkette kann eine hohe Aktualisierungsrate erreicht und damit dem Spieler die Präsenz einer ”echten”, lebenden Welt, die auf seine Handlungen reagiert, suggeriert werden. Jedes Spiel enthält in Abhängigkeit von Spielgenre, vorhandener Teil-Engines und anderer spielspezifischer Kriterien eine mehr oder weniger ausgeprägte Spiel-Hauptschleife. In der Anzahl der Durchläufe pro Sekunde können sich die Hauptschleifen allerdings stark unterscheiden. So benötigt eine SchachspielEngine deutlich weniger Durchläufe, da nur nach Änderung von Schachfiguren neue Berechnungen folgen. Bei einem 3D-Spiel allerdings erfolgen 30-60 Durchläufen pro Sekunden, da eine möglichst hohe Bildwiederholrate erzielt und sehr zeitnah auf Eingaben des Spielers reagiert werden muss. Wenn es das Spiel zu beenden gilt, führt der Engine-Kern Programmroutinen durch um den ursprünglichen Systemzustand vor Spielstart wiederherzustellen. Dazu werden zuerst eventuelle Spielstände gesichert und aktuelle Konfigurationen des Spiels gespeichert, Teil-Engines beendet und Hardwarezustände (wie beispielsweise Bildschirmauflösung) auf den vorherigen Systemzustand zurückgesetzt. 3.3 Architektur Nach Aufbau und Arbeitsweise einer Game-Engine soll nun die Beschreibung der Architektur folgen. Dazu wird zunächst Softwarearchitektur definiert, um dann die einzelnen Ebenen der Schichtenarchitektur zu erläutern. Softwarearchitektur selbst beschreibt die Zusammensetzung und das Zusammenspiel von Komponenten eines Softwaresystems. ”Sie wird wesentlich durch nicht-funktionale Eigenschaften wie Modifizierbarkeit, Wartbarkeit, Sicherheit oder Performance bestimmt.” [Wik07d] Um die Zusammenhänge bei der Architektur von Computerspielen zu erklären, beziehe ich mich im Folgenden auf eine Darstellung von Hannes Niederhausen [Nie06, S. 14]. 16 3 AUFBAU UND ARCHITEKTUR EINER GAME-ENGINE Abbildung 5: Softwarearchitektur eines Computerspiels Im Verlauf dieser Arbeit wurden die in Abbildung 5 gezeigten vier wichtigen Abstraktionsebenen bereits eingeführt. Die Treiberebene bildet die Abstraktion zur Hardware (Hardware Abstraction Layer (HAL)). Diese erzeugt eine Standard-Schnittstelle zur Hardware die um meist unterschiedlichen Systemkomponenten über einheitliche Befehle zu steuern (vgl. auch Middleware/API Kapitel 2.2). Eine weitere Abstraktionsebene wurde mit der (Game-)Engine geschaffen (hier: Modulebene). Aus Gründen der Übersichtlichkeit, Wartbarkeit und Teamfähigkeit wurde die Engine modularisiert (vgl. auch Game-Engine Kapitel 3.1). Jedes Teilmodul nutzt die gemeinsame Schnittstelle über die Treiberebene um die Funktionalität der Hardware auszuüben. Der Bereich der Gamecode Ebene spielt hauptsächlich eine Rolle, wenn Spieleentwickler eine Engine für ihr Spiel kaufen anstatt diese selbst zu entwickeln. Eine gekaufte Engine erfüllt selten sofort alle Ansprüche, die Entwickler an die Funktionalität der Engine stellen. Deshalb müssen in vielen Fällen noch diverse Anpassungen an die Engine vorgenommen werden, damit diese alle Besonderheiten des Spiels (zum Beispiel wegen eines besonderen Genres) abdeckt. Diese Anpassungen finden in der Gamecode Ebene statt und können in Form erstellter Plugins oder auch als Skript in die Engine eingebunden werden um die Funktionalitäten wie gewünscht zu modifizieren. (vgl. auch Engine-Skripting Kapitel 4.2) Die Ressourcenebene umfasst nun alle Daten, die mit dem eigentliche Spiel auf kreativer Ebene zu tun haben. Dazu gehören Spieldaten (wie Texturen, Modelle, Sounds, usw.) und die Spiellogik (meist Skripte), die das gesamte logische Spielgeschehen beschreibt und steuert. 17 4 Besonderheiten im Spieleentwicklungsprozess Dieses Kapitel befasst sich mit dem Einsatz und der Einbettung von Engines und Middleware im Spieleentwicklungsprozess. Dabei soll auf Fragen der Engineentwicklung, Anpassungen der Engine an das Spiel und Kompatiblität zu anderen Hardware- oder Softwarearchitekturen eingegangen werden. 4.1 Engineauswahl Früher oder später stellt sich für jeden Spieleentwickler die Frage, welche Engine sich für das zu erstellende Spiel am besten eignet oder ob man sogar selbst eine eigene Engine programmieren sollte. Um hier eine weise Entscheidung zu treffen, sollten wir uns zunächst mit den Vor- und Nachteiler eigener, gekaufter (kommerzieller) oder kostenloser (gegebenenfalls open source2 ) Engines befassen. Bei der Entwicklung einer eigenen Engine ist zu beachten (Vor- und Nachteile): • Engine wird primär für dieses Spiel entwickelt und liefert daher alle geforderten Funktionalitäten • das Team ist mit der Engine vertraut, kann Modifikationen und Erweiterungen sofort durchführen und Fehler schnell beheben • Engine kann im Nachhinein für weitere Projekte der Entwickler wiederverwendet oder sogar verkauft werden • hohe mathematische und programmiertechnische Kenntnisse sind vorausgesetzt • möglicherweise lange und schwer einschätzbare Entwicklungszeiten der Engine (damit verbunden ggf. hohe Entwicklungskosten) Entscheidet sich ein Entwickler dafür, eine eigene Engine zu erstellen, muss dies natürlich zu Beginn der Entwicklung erfolgen. Neben dem Designentwurf des Spiels, muss dann auch ein Architekturentwurf der Engine folgen und entschieden werden, welche Teil-Engines benötigt werden, welche Plattformen die Engine unterstützen soll und welche Middleware (OpenGL, Speedtree, usw.) verwendet werden soll. Andere Gruppen wie Grafiker, Modellierer, Designer, etc. arbeiten trotzdem parallel zur Engineentwicklung bereits am Spielinhalt. Da die Engine zu diesem Zeitpunkt noch nicht fertig ist, verschiebt sich auch die Erstellung eines Prototypen. 2 der Quellcode liegt offen und ist frei zugänglich 18 4 BESONDERHEITEN IM SPIELEENTWICKLUNGSPROZESS Wenn man sich nun dafür entscheidet die Engine eines Drittanbieters zu verwenden, bedenke man (Vor- und Nachteile): • Entwicklungszeit und -kosten werden gespart • höhere Qualität der Engine durch meist auf diesem Gebiet spezialisierte Entwickler • möglicherweise hohe Lizenzkosten • Team muss sich erst mit der Engine vertraut machen und einarbeiten • viele Spiele mit der selben Engine wirken weniger individuell • eigene, neuartige Genres lassen sich mit vorgefertigten Engines schwer realisieren Bevor allerdings die Engine eines Drittanbieters für ein eigenes Projekt verwendet werden kann, muss diese erst an die besonderen Eigenschaften und Anforderungen des Spiels angepasst werden. Bei Engines mit offenem Quellcode, ist das relativ einfach, da die Entwickler Änderungen in beliebiger Größe und Detailgrad direkt im Quellcode vornehmen können. Da die gesamte Funktionalität der Engine offen liegt, lassen sich auch gesamte Blöcke im Quellcode austauschen und Anbindungen an eigene Software ohne Verwendung von Middleware leicht realisieren. Wenn Engines ohne Quellcode (closed source) gekauft werden, ist man in hohem Maße auf den Hersteller angewiesen. Dieser muss ohne Zugriff auf den Quellcode zu geben, die Engine dynamisch und flexibel gestalten und Möglichkeiten schaffen, die komplette Funktionalität der Engine zu Modifizieren. Hierzu legt er der Engine zusätzliche Tools bei, die den Entwicklern auf abstrakte Weise Änderungen an der Engine oder den Programmroutinen durchführen lassen. Weiterhin schaffen Hersteller Schnittstellen in Form von Plugins oder Skripten (sogenanntes Engine-Skripting), um Spieleentwickler in die Lage zu versetzen, eigene, neue Funktionen einzubinden oder bestehende Funktionen der Engine ersetzen zu können. Wenn die Entwickler andere Tools verwenden, die von sich aus keine Möglichkeit bieten mit der Engine zu kommunizieren, sind sie auf Middleware angewiesen, die zwischen Engine und Tool ”geschaltet” werden kann. Auf den angesprochen Bereich des Engine-Skripting soll nun im Folgenden etwas näher eingegangen werden. 4.2 Engine-Skripting 4.2 19 Engine-Skripting Engine-Skripting bezeichnet das Verfahren eine Engine oder sogar das darauf aufbauende Spiel mittels Skripten zu steuern und zu verändern. Die Idee ist die technische Ebene einer Hochsprache zu abstrahieren und den Spiele-Designern eine leicht verständliche, gut strukturierte Skriptsprache (zum Beispiel LUA) an die Hand zu geben, um Engine oder Spielwelt zu modifizieren. Die Bearbeitung der Skripte geschieht in der Skript-Engine, wobei hier die in der Skriptsprache formulierten Anweisungen mittels eines Interpreters interpretiert werden und dann die geforderten Aktionen auf dem System ausgeführt werden. Skripte lassen sich ohne Neukompilierung des Spiels laden und interpretieren, wodurch sich schnell und bequem Änderungen am Spielinhalt und -verhalten durchführen lassen. Daneben bieten Skriptsprache durch den Interpreter eine gesicherte Umgebung, in der auch bei syntaktisch oder logisch falschem Skripting keine schweren Systemschäden auftreten können. Computerspiele werden meist in mehreren Programmiersprachen entwickelt. Die Verwendung hängt davon ab, an welcher Stelle und in welchem Teil des Spiels, die Programmiersprachen am effizientesten eingesetzt werden können. Während beispielsweise das Skripting in einer möglichst abstrakten Sprache, mit der sich Spielverhalten leicht beschreiben lässt, stattfindet, wird für die Programmierung der Grafik-Engine meist eine Mischung aus C und Assembler genutzt, weil es hier auf die Geschwindigkeit der Abarbeitung der Befehle ankommt. Der Einsatz von Skriptsprachen bietet dem Spielehersteller allerdings nicht nur den Vorteil der effizienten Entwicklung von Spielen. Viel mehr entsteht dadurch die Möglichkeit auch den Spielern selbst Einfluss auf das Spiel nehmen zu lassen. So können Spieler eigenen Inhalt und Ideen einbringen und das Spiel so, neben den vom Hersteller verkauften Addons und Extension Packs, für sich und andere auch einen längeren Zeitraum interessant gestalten. Dazu ist es aber notwendig, dass der Hersteller Schnittstellen zum Spiel schafft, in denen die Spieler ihren eigenen Inhalt und Skripte erstellen und einbinden können. Dies geschieht durch sogenannte Software Development Kits (SDK), die Hersteller dem Spiel beilegen oder nachträglich zur Verfügung stellen. Hierbei Handelt es sich um Sammlungen von Werkzeugen, Programmen und Editoren, ähnlich diesen, die die Spieledesigner zur Entwicklung des Spiels verwendet haben. Alle Veränderungen, die Spieler vornehmen, um den kreativen Inhalt oder das Spielgeschehen ihren Wünschen anzupassen, werden allgemein als ”Modding” bezeichnet. Die Seminararbeit ”Development Suites and Game Modifications” wird vertiefend auf dieses Themengebiet eingehen. 20 4.3 4 BESONDERHEITEN IM SPIELEENTWICKLUNGSPROZESS Cross-Platform-Development Viele Spiele sprechen große Zielgruppen an, die diese allerdings nicht immer auf dem PC zuhause spielen möchten. Die Konsumenten wünschen sich die Unterhaltung auch auf ihre Spielkonsolen, Videoautomaten oder Handys. Das haben die Spielehersteller natürlich auch erkannt und bieten daher ihre Spiele für ein möglichst großes Spektrum von Hardwareplattformen und verschiedene Betriebssysteme an. Die unterschiedlichen Hard- und Softwarearchitekturen sind untereinander allerdings nicht kompatibel, so kann keine PC-CDRom in eine Playstation eingelegt werden oder kein Windows-Spiel unter Linux starten. Im Verlauf dieser Arbeit haben wir bereits die Schichtenarchitektur der Engine (Abbildung 5) kennen gelernt. Durch die angewandte Abstraktion und Trennung von Engine und Inhalt muss nicht das komplette Spiel neu erstellt werden, sondern nur die plattformspezifischen Teile (dem Spielinhalt ”ist es egal” auf welcher Systemplattform er dargestellt wird). Vereinzelt reicht es schon, nur die Treiberebene zu ersetzen, um so die Kompatiblität zu einem anderen Betriebssystem zu schaffen. Eine Portierung auf andere Hardwareplattformen stellt sich allerdings etwas schwieriger dar. Hierbei ist neben der Notwendigkeit einer kompletten Neukompilierung bereits während der Entwicklung der Engine darauf zu achten, spezielle Hardwarefunktionen, die beispielsweise nur auf einem Intel-CPU ausgeführt werden können, zu vermeiden. Ferner können dann durch einen Ausstausch der Treiberebene (mit einer Treiberebene / API des Konsolenherstellers) und damit der Schnittstelle zwischen Hardware und Software (ähnlich einer Virtuellen Maschine), darüber liegende Programme ohne inhaltliche Modifikationen auf gewohnte Art und Weise die Hardware ansprechen (sie merken nicht einmal, dass eine andere Hardware zugrunde liegt). Des weiteren darf nicht vergessen werden, dass andere Plattformen, besonders durch spezielle Hardware, auch andere Systemvoraussetzungen bieten. Besonders müssen hier die Spielekonsolen hervorgehoben werden, da diese meist lange Zeit im Einsatz sind, sich dadurch nicht immer auf dem aktuellen Stand der Technik befinden und so möglicherweise nicht die selbe Performance wie der PC zuhause bieten. Um weiterhin einen flüssigen Ablauf des Spiels zu gewährleisten, müssen in der Engine, bereits während der Entwicklung, Vorkehrungen getroffen werden, die Leistung bestimmter Teil-Engines (meist Grafik) zu drosseln, damit das Spiel auch auf schlechter ausgestatteten Plattformen lauffähig bleibt. Hier gilt es zum einen den Besitzern schlechterer Hardware mit flüssig ablaufenden Spielen entgegen zu kommen, als auch den Spielern mit neuester Technik eine hohe Ausnutzung ihrer Spielehardware zu bieten. 21 5 Ausblick Im Laufe dieser Arbeit sollte die Stellung und Wichtigkeit von Engines und Middleware in der Spieleentwicklung klar geworden sein. Durch geschickt gewählte Abstraktionsebenen ist es möglich geworden die künstlerische Arbeit eines Designers von der technischen Arbeit eines Programmiers zu trennen. Dadurch werden Entwicklungseschwindigkeit und Qualität des Spiels verbessert, was dem Hersteller in Kostenersparnis und dem Spieler in Spielspass zu Gute kommt. Modularisierung und klar definierte Schnittstellen bieten die Option, ganze Teile einer Engine austauschen und so Funktionalitäten zu ersetzen oder Kompatiblität zu anderen Hardwareplattformen zu schaffen. Leider lassen sich neue, ausgefallene Spielgenres schwierig auf herkömmlichen, bestehenden Engines aufsetzen und mehrere, auf derselben Engine beruhenden Spiele, wirken weniger individuell. Game-Engines finden heutzutage vermehrt Anwendung auch außerhalb ihres eigentlich konzipiertes Einsatzes in Computerspielen. Durch dieses sogenannte ”Serious Gaming” entstehen immer mehr Werbespots, 3D-Rundflüge, Taktiksimulationen oder Präsentationen auf der Grundlage einer SpieleEngine. Grund dafür ist, dass Heute, in einer Zeit frei erhältlicher GameEngines und steigender Benutzerfreundlichkeit Jedermann in der Lage ist mit der nötigen Software und ein wenig Wissen darüber, eigene Spiele und 3D-Welten zu erstellen. Hierin findet sich für Wirtschaft, Wissenschaft oder Militär eine kostengünstige, einfache Alternative professionelle 3D-Visualisierungen zu erstellen, ohne auf teure Präsentationswerkzeuge zurückgreifen zu müssen. Die Zukunft von Engines ist schwer abzusehen, aber es ist gut vorstellbar, dass im Zuge weiterer Spezialisierung von Engine-Herstellern und wachsender Gemeinden im Open Source Bereich, universelle Spieleengines entstehen. Diese könnten mittels Plugins, Skripting und Werkzeugen den Entwicklern auf hoher Abstraktion die Möglichkeit bieten, die Engine komplett zu modifizieren um auch extravagante, neuartige Genres enstehen zu lassen. Um den Umgang mit Game-Engines und die Erstellung und Verwendung von 3D-Spielen, -Welten und -Simulationen noch einfacher zu gestalten, wurden Hilfsmittel in Form von Programmen, Werkzeugen und Ressourcensammlungen erstellt um so ohne großen Aufwand und möglichst schnell Projekte erstellen zu können. Diese Hilfsmittel werden zu sogenannten Development Suiten zusammen gefasst, womit sich die anschließende Seminararbeit eingehend befassen wird. 22 5 AUSBLICK ABBILDUNGSVERZEICHNIS 23 Abbildungsverzeichnis 1 Middleware zwischen Anwendungen . . . . . . . . . . . . . . 9 2 Middleware zwischen Spiel und Plattform . . . . . . . . . . . 9 3 Einordnung der Engine zwischen Anwendung und Hardware . 10 4 Modularisierung der Game-Engine . . . . . . . . . . . . . . . 11 5 Softwarearchitektur eines Computerspiels . . . . . . . . . . . 16 24 ABBILDUNGSVERZEICHNIS 25 LITERATUR Literatur [Bec96] Stefan Becker. Überblick über Ansätze und Werkzeuge der umfassenden Software-Wiederverwendung. Universität Kaiserslautern, Fachbereich Informatik, 1996. [Bri05] Daniel Gottschlag, Mathias Bricke. Entwicklung von Computerspielen/Game Middleware. Otto-von-Guericke-Universität Magdeburg, 2005. [Bro01] William A. Ruh, Francis X. Maginnis, William J. Brown. Enterprise Application Integration. John Wiley & Sons, 2001. [Dam02] Holger Dammertz. Spiele unter Linux (SDL). Universität Ulm, 2002. [Fei06] Luis Valente, Aura Conci, Bruno Feijó. Real Time Game Loop Models for Single-Player Computer Games. Universidade Federal Fluminense, 2006. [Fug04] Torben Fugger. 3D-Game-Engine. Universität Koblenz, 2004. [Geb07] Nikolaus Gebhardt. Irrlicht - Lightning Fast Realtime 3D Engine. http://irrlicht.sourceforge.net/, 2007. [Kna06] Björn Knafla. Wie kommt der Drache ins Computerspiel? Universität Kassel, 2006. [Lin99] Christian Lindig. Algorithmen zur Begriffsanalyse und ihre Anwendung bei Softwarebibliotheken. Universität Braunschweig, Fachbereich für Mathematik und Informatik, 1999. [Nac05] Lennart Nacke. Facilitating the Edication of Game Development. Otto-von-Guericke Universität Magdeburg, Fachbereich Informatik, 2005. [Nie06] Hannes Niederhausen. Architektur im Bereich der Entwicklung von Computerspielen. Universität Leipzig, Fachbereich Informatik, 2006. [Opp03] Christian Geiger, Leif Oppermann. Skriptbasierte Entwicklung interaktiver 2D/3D-Inhalte. Hochschule Harz, Medieninformatik, 2003. [Rin06] Ralf Dörner, Dirk Ringe. Kein Kinderspiel. iX 9/2006, 2006. [Ste04] Kai Sterker. Andonthell www.linuxgames.com, 2004. Engine Architecture. 26 LITERATUR [Web06] Niels Weber. Spiele-Software und Open Source. Technische Universität Berlin, 2006. [Wik07a] Wikipedia. Framework. Framework, 2007. http://de.wikipedia.org/wiki/ [Wik07b] Wikipedia. Game engine. Game_engine, 2007. http://en.wikipedia.org/wiki/ [Wik07c] Wikipedia. Grafik-Engine. Game-Engine, 2007. http://en.wikipedia.org/wiki/ [Wik07d] Wikipedia. Softwarearchitektur. http://de.wikipedia.org/ wiki/Softwarearchitektur, 2007.