Blog

JavaFX 8 für die Spieleentwicklung einsetzen

22. September 2014

Mit der Veröffentlichung von Java 8 enthält nun sowohl das JDK als auch die JRE standardmäßig die neueste Version von JavaFX, das bei dieser Gelegenheit von Oracle von Version 2.2 in Version 8 umetikettiert wurde. Grund genug, sich die Entwicklung mit JavaFX einmal genauer anzuschauen und auf ihre Eignung sowohl als Nachfolger von Swing als auch für ganz neue Einsatzzwecke hin zu untersuchen. In diesem Beitrag soll es aber vor allem um die Spieleentwicklung mit JavaFX 8 gehen – und um dessen Vor- und Nachteile dabei.

Java 8 – Fortschrittlich

Da JavaFX-Anwendungen (mittlerweile) weitestgehend normale Java-Anwendungen mit einer eigenen API sind, kann zunächst einmal auf die komplette und mächtige Klassenbibliothek von Java 8 sowie dessen neuesten Sprachfeatures zurückgegriffen werden.

Für die Spieleentwicklung besonders interessant sind dabei die zahlreichen Klassen zur Ein- und Ausgabesteuerung von Daten, zur Netzwerkprogrammierung, für einfache und komplexe Datenstrukturen sowie viele weitere nützliche Klassen, die z.B. den Umgang mit Datums- und Zeitangaben oder Nebenläufigkeit erleichtern. Kurz gesagt enthält die Java-Laufzeitumgebung bereits eine ganze Menge fertiger Funktionen, die man bei anderen, vor allem maschinennäheren Sprachen wie C/C++ erst mühsam einbinden – oder noch dümmer schlimmer, selbst programmieren – muss.

Die mit Java 8 eingeführten Lambda-Ausdrücke sowie die dazugehörigen funktionalen Schnittstellen (engl. functional interfaces) sind zudem nach kurzer Eingewöhnungsphase richtig praktisch und beschleunigen die Entwicklung merklich (insbesondere mit guter IDE(A)). Als zweites großes Feature ermöglichen Standardmethoden für Schnittstellen (engl. default methods) nun erstmals eine Art Mehrfachvererbung, welches effizientere und flachere Objekthierarchien erlaubt und wesentlich zur Deduplikation von Code beitragen dürfte.

Grundsätzlich lassen sich mit Java (auch dank eingebautem Garbage Collector (den man bei Spielen allerdings nicht allzu häufig laufen lassen sollte)) sehr sauber strukturierte Programme auf hoher Abstraktionsebene mit (theoretischer) Plattformunabhängigkeit entwickeln. Dank zahlreicher Optimierungsmaßnahmen der Laufzeitumgebung ist Java dabei mittlerweile nur noch unwesentlich langsamer als maschinennahe Sprachen. Allerdings kommt es bei einfacheren Spielen ohnehin nicht mehr so auf die bestmögliche Ausführungsgeschwindigkeit an.

JavaFX 8 – Wer kennt’s?

Mit JavaFX hat Oracle im Laufe der Zeit verschiedene Konzepte ausprobiert, insbesondere wurden JavaFX-Anwendungen anfangs noch mit einer eigenen Skriptsprache entwickelt. Das hat sich zwar mittlerweile geändert, aber dennoch Spuren hinterlassen. Schaut man sich im Internet auf einschlägigen Diskussionsplattformen um, hat man schnell den Eindruck, kaum jemand möchte sich mit JavaFX beschäftigen oder nimmt es als Nachfolger von Swing ernst. Aus Unwissenheit wird es gar häufig als reine Webtechnologie abgetan.

Dabei wird JavaFX von Oracle selbst als Swing-Nachfolger gehandelt und erlaubt die Entwicklung vollwertiger grafischer Desktopanwendungen – genau wie Swing. Anders als Swing geht das mit JavaFX allerdings erheblich schneller und sauberer von der Hand – und kann sogar richtig Spaß machen.

Verknotet

Im Zentrum von JavaFX steht der sogenannte Scene graph, also eine Baumstruktur, welche (potenziell verschachtelte) Knoten (engl. nodes) enthält. Knoten können von Bildern, über Videos, einfachen geometrische Formen bis hin zu komplexen Bedienelementen alles sein. Dabei übernimmt JavaFX das Rendern der Knoten mit einer maximalen Bildrate von 60 Bildern pro Sekunde, inklusive Optimierungen. Solche Szenengraphen sind auch bei den meisten bekannten 3D-Engines zu finden.

Zusätzlich kann man alle Knoten, ob einzeln oder in einer Hierarchie gruppiert, mit unterschiedlichen Effekten (Schlagschatten, Schein, Glanz, Weichzeichnung, …), Transformationen (Translation, Rotation, Skalierung) und Animationen (Übergängen, Keyframe-basierten Zeitleisten) ausstatten. Das ist einfach zu verstehen, noch einfacher anzuwenden und erlaubt in kürzester Zeit komplexe und dynamische Anwendungen und Spiele. Knoten oder ganze Teilbäume können zur Laufzeit ein- und ausgehangen werden. Dank der Animationsklassen braucht man sich kaum mehr mit der Synchronisation und zeitlichen Abstimmung von Frames und Bewegungen darin herumzuschlagen. Das übernimmt alles JavaFX. Ideal also für Einsteiger und schnelle Prototypen.

3D

Bemerkenswert ist, dass man mit JavaFX 8 sowohl 2D- als auch 3D-Elemente miteinander vermischen kann. So erben alle Knoten beispielsweise von der Basisklasse Node die Translation (also Verschiebung) und Rotation auf allen drei Achsen (X, Y und Z). Visualisiert wird das ganze dann durch einen Kamera-Knoten – entweder perspektivisch oder parallel.

Dadurch können prinzipiell aufwendige 3D-Inhalte mit 2D-Oberflächen mühelos kombiniert werden. Praktisch steht die 3D-Engine von JavaFX aber noch ganz am Anfang. Gerade einmal eine Hand voll verschiedener Primitive und ein einziges Material (Phong) steht hier in der aktuellen API zur Verfügung. Auch muss man sich grundsätzlich mit den angebotenen Klassen und Funktionen begnügen. Eigene Shader beispielsweise kann man derzeit nicht einbauen.

2D

Bei 2D-Anwendungen und -Spielen wird alles auf der XY-Ebene gezeichnet (Z = 0). Dabei ist zu beachten, dass die Reihenfolge (z-order) der Zeichenoperationen im 2D-Modus allein von der Position in der Liste der Kindknoten abhängt, also praktisch von der Reihenfolge der Einfügung der Knoten in den Szenengraphen.

Die Z-Koordinate der Knoten hat dann keinen Einfluss mehr auf die Überlagerung: Die Knoten werden streng in ihrer Reihenfolge im Szenengraph gezeichnet. Das bedeutet aber nicht, dass 3D-Elemente nicht mehr eingefügt werden könnten.

Der Unterschied zwischen dem 2D- und dem 3D-Modus liegt vor allem im Konstruktorparameter Depth Buffer der Scene-Objekte. Standard ist 2D.

Übrigens: Die Kamera verschieben, rotieren oder zoomen zu lassen ist mit den JavaFX-Knoten ein Kinderspiel!

HTML5 & CSS

Dank der vollständig integrierten, leistungsfähigen WebKit-Engine lassen sich viele Bedienelemente mit bekannten HTML5-Auszeichnungen versehen.

JavaFX Modena-Optik
JavaFX Modena-Optik

Beeindruckend einfach ist auch die konsequente Gestaltung aller Bedienelemente mit W3C-konformem CSS, wobei die mit JavaFX 8 mitgelieferte (neue) Optik namens Modena schon sehr ansprechend daherkommt.

Das Standard-Aussehen (Look & Feel) des Betriebssystems ist damit übrigens, im Gegensatz zu AWT/Swing, erstmal nicht mehr einstellbar. Dafür sehen JavaFX-Anwendungen dann aber auch auf allen Plattformen weitestgehend gleich aus.

Achja …

JavaFX bringt darüber hinaus eine ganze Reihe weiterer netter Features mit, wovon hier nur einige kurz aufgezählt werden sollen. Beispielsweise können AWT- und Swing-Elemente als spezielle Knoten in die Szene eingebaut werden. Die Oberfläche kann optional deklarativ mittels FXML beschrieben werden. Zudem geht JavaFX mit den Property-Objekten neue Wege bei der Beobachtung (Observable) und Verknüpfung (Binding) von Objekt-Eigenschaften. Letzteres ist für Spiele natürlich besonders interessant, da sich so schnell und intuitiv Abhängigkeiten und Ereignisbehandlung zwischen Eigenschaften verschiedener (Spiel)Objekte abbilden lassen.

Einfache API

Schaut man sich die API von JavaFX an, bemerkt man wie aufgeräumt und verständlich die einzelnen Klassen daherkommen. Wer an AWT oder Swing gewöhnt ist, wird gar misstrauisch beim Anblick der geradeheraus zutreffend benannten, übersichtlich zusammengestellten Klassen.

Die einfachere Klassenhierarchie geht allerdings auf Kosten der Erweiterbarkeit. In der Regel muss/sollte man die angebotenen Klassen der JavaFX-API nutzen, wie sie sind. Eigene Modifikationen an den Kernklassen sind nur selten möglich, da eine Low-Level-API fehlt.

Verteilung

JavaFX-Anwendungen laufen derzeit auf Windows, Mac OS und Linux. Hierfür können sie nicht nur als übliche JAR-Dateien verteilt werden, sondern Oracle liefert mit dem SDK 8 sogar ein Programm mit, mit dem sich JavaFX mit einer minimalen JRE als ausführbare Datei verpacken lässt. Damit entfällt auch die Abhängigkeit einer bestimmten JRE beim Kunden und es können eigenständig lauffähige Programme ausgeliefert werden.

Besonders interessant sind auch die Bestrebungen, JavaFX auf die mobilen Betriebssysteme zu bringen, vor allem auf Android. Die technische Basis dafür (z.B. Touch-Ereignisse) ist bereits in der JavaFX-API vorhanden. Noch ist das aber nicht möglich.

Architektur

JavaFX Architektur-Diagramm
JavaFX Architektur-Diagramm

Betrachtet man die Architektur von JavaFX 8 genauer, stellt man überrascht fest, dass das Grafiksystem je nach Verfügbarkeit auf OpenGL oder DirectX fußt und somit die gesamte JavaFX-Szene potenziell hardwarebeschleunigt ist. Nur im Notfall wird auf Software-Rendering via Java2D zurückgegriffen.

Das ist schon nicht schlecht. Und Voraussetzung für flüssige, auch aufwendigere Spiele.

Wer sich schon einmal mit OpenGL oder DirectX beschäftigt hat, weiß, dass die Arbeit mit diesen Schnittstellen alles andere als trivial ist – insbesondere unter Java. Hier wird also durchaus eine leistungsfähige Abstraktionsschicht geboten.

Zählen wir alle genannten (und nicht genannten) Features von Java 8 und JavaFX 8 zusammen, ergibt sich eine mächtige Entwicklungsplattform für Desktopanwendungen und Spiele. Damit können in kurzer Zeit und mit überschaubarer Zeilenzahl Programmcode ansprechende Prototypen programmiert werden, die flüssige, hardwarebeschleunigte, kantengeglättete 2D/3D-Animationen enthalten. Und das alles ohne zusätzliche Werkzeuge oder Softwarebibliotheken – allein mit dem Java 8 SDK.

Aber …

Leider gibt es auch ein paar Kröten zu schlucken.

Zunächst ist die JavaFX API-Dokumentation noch teilweise unvollständig. Wichtige Informationen muss man sich über (teils offizielle) Blog-Beiträge und Beispielanwendungen selbst zusammensuchen.

Auch wird an der JavaFX-API noch fleißig gebastelt, an einigen Stellen merkt man das. Sie erscheint nicht immer vollends fertig zu sein.

Schade sind auch die derzeit noch stark eingeschränkten 3D-Fähigkeiten. So ist Transparenz von 2D/3D-Objekten im 3D-Modus (also mit eingeschaltetem Depth Buffer) nicht möglich. Dieses Problem ist den JavaFX-Entwicklern bekannt und soll angeblich mit Java 9 nachgerüstet werden.

Fazit

Für kleinere und mittelgroße Desktopanwendungen ist JavaFX definitiv der Weg der Zukunft. Die Entwicklung ist um Größenordnungen einfacher und effzienter als mit Swing oder gar AWT. Für größere Projekte sowie Spiele fehlen unter Umständen noch einige wichtige, fortgeschrittene Funktionen, die aber mit der Zeit nachgereicht werden sollten. Hier gilt es abzuwägen und/oder auszuprobieren. Für größere Teams oder Unternehmen mit Langzeitprojekten ist es zudem auch gut zu wissen, dass JavaFX langfristig von Oracle und der Community weiterentwickelt wird. Eine Sicherheit, die es bei anderen Bibliotheken oder Frameworks nicht immer gibt.

Letztendlich sind die gebotenen Funktionen äußerst mächtig und trotzdem einfach zu handhaben. Die Kombination von Java 8 mit JavaFX 8 hat definitiv großes Potenzial für moderne 2D- und 3D-Spiele.

Bitte lesen Sie unsere Hinweise zum Datenschutz bevor Sie diese Buttons nutzen