Klar sind Spiele in Java möglich!
Bei unserem
2D MMORPG Pentaquin (
Pentaquin Foren Vorstellung) setzen wir sogar voll auf Java, sowohl im Server, als auch im Client Bereich.
JavaFX ist ein reines GUI Framework / Library, für GUI ist es richtig geil, aber für Spiele würde ich es aus Performance Gründen nicht verwenden - oder würdest du ein Spiel mit AWT / Swing schreiben? Dennoch sind kleine Spiele auch mit JavaFX ohne Probleme zu realisieren.
Wenn man ein Spiel erstellt, sollte man in Java aber auf OpenGL setzen, dafür gibt es dann libraries wie LWJGL. Da man in Java memory native allozieren kann und genau das LWJGL für seine native calls auch macht, hat man den GC Overhead auch nicht beim Rendern und die Performance kann sich sehen lassen.
Spiele Engines wie die bereits erwähnte JMonkeyEngine, das alt bekannte Slick2D oder eben libGDX basieren wiederum auf LWJGL. Auch Minecraft baut auf LWJGL auf, allerdings habe ich hier schon oft gelesen, dass man Minecraft wohl lieber nicht als Beispiel verwenden sollte - inhaltliches Zitat: "Minecraft ist das schlechteste Beispiel für Java, da die Performance nicht besonders gut ist - das liegt allerdings nicht an Java, sondern am Entwickler!"
Java Applets (bezüglich Browser) wurden übrigens eingestampft:
https://jaxenter.de/java-deprecated-orac…r-plug-in-33979
Nee, JavaFX ist sowas wie Flash (mal war). Damit kann man ziemlich viel machen, eben auch Spiele. Dreh- und Angelpunkt ist immer die Grafikfähigkeit und wie schnell die Grafik ist. Das entscheidet über Spieletauglichkeit. Das ist ne API, relativ "low level". Also sowas wie bitmapdata.copypixel() ist da die beste Funktion überhaupt und sauschnell! Wirklich
JavaFX mit Flash zu vergleichen ist wie ein Vergleich zwischen Apfel und Birne - natürlich haben beide ein UI geboten, aber das Ziel hinter Flash oder Java Applets war die Portierung für den Browser - damals gab es noch nicht solche Canvas in HTML o.ä., mit denen man diese Sachen bereits mit HTML und Javascript erledigen konnte.
Wie schnell die Grafik ist, hängt von mind. 4 Sachen ab:
- Berechnung auf der CPU oder GPU
- Wie schnell können Daten auf die GPU hochgeladen werden?
- Kann man die z.B. OpenGL Api direkt ansteuern?
- Wie viel GC Pressure erzeugt wird
Mit LWJGL kann man direkt auf OpenGL setzen und die GPU damit direkt ansprechen - wenn man das tut, hat man ungefähr die selbe Performance wie ein in C++ geschriebenes Spiel, welches OpenGL nutzt. DirectX funktioniert so ähnlich wie OpenGL, soll zwar ein kleines bisschen schneller sein, dafür läuft es eben aber auch nur unter Windows.
Der nächste Punkt ist:
Wie schnell eine Applikation unter Java oder C++ ist, hängt auch viel vom Entwickler ab!
Beispielsweise kann ein Java Entwickler Spiele schreiben, welche deutlich schneller sein könnten, als ein Spiel, welches in C++ geschrieben wurde, wenn der C++ Programmierer nicht so viel Ahnung hatte. In Java kann dir der Garbage Collector, wenn man nicht aufpasst, die Performance schnell herunterziehen, dafür kann es bei C++ passieren, dass man immer mehr Memory Leaks öffnet, da der Speicher nicht richtig verwaltet bzw. wieder freigegeben wird. Und gerade im Multi Threading Bereich weiß man ohne Reference Counting manchmal gar nicht, ob eine Variable noch in Benutzung ist, oder nicht.
Dazu kommt, dass die Java JVM schon recht intelligent ist und sehr viel optimiert, habe da schon einiges zu gehört und gelesen, seien es Speicherzugriffe, Methodenaufrufe (Code einfach mit rein kopieren, um Methoden Aufruf zu sparen) usw. Desweiteren ist Multi Threading in C++ nicht sehr beliebt (sehr umständlich), in Java aber sehr einfach zu realisieren. Multi Threading kannst du mit Java richtig schön bewerkstelligen.