Soweit ich weiß werden die meisten der brandneuen Spiele, vor Allem die, die aufwendige Grafiken beinhalten, ...
Ich gehe aufgrund dieses Halbsatzes in meinen folgenden Ausführungen mal davon aus, dass es dir hauptsächlich um grafiklastige AAA-Titel geht.
Kurze Antwort: Nein, das ist mit Java nicht möglich. Deshalb gibt es solche Java-Spiele auch nicht. Vom Spielprinzip her interessante Spiele wie Minecraft gehen natürlich, aber Minecraft sieht nicht ohne Grund wie Minecraft aus. :)
Lange Antwort: Java ist und bleibt merklich langsamer als C++, vor allem wenn es um ganze Programme, und nicht nur um kurze Demo-Algorithmen mit ein paar Zeilen geht.
Allein schon die Tatsache, dass Javacode in einer "gemanageten Umgebung" ausgeführt wird und auf einen GC (Garbage Collector) angewiesen ist, der dir zu nicht-vorhersebahren Zeiten in den Fluss deines Programms eingreifen wird, verhindert, dass ein Spiel flüssig und ohne merkliche Ruckler laufen wird.
Du kannst den GC zwar auf einen eigenen CPU-Kern auslagern, aber selbst dann muss er in Echtzeit (!) mit den anderen Threads / Prozessen kommunizieren, und so eine IPC (Interprozesskommunikation) frisst enorm viele Ressourcen.
Dazu zählt auch der erhöhte Speicherverbrauch. Im Schnitt verbrät der GC bei Java ca. anderthalb mal so viel Speicher für das aufzuräumende Objekt, als dieses in Wirklichkeit an Speicher belegt. Und "Speicher reservieren" ist so ziemlich die aufwändigste Operation, die intern in einem Programm ablaufen kann und gerne mal einige tausend CPU-Takte andauert.
Deshalb gibt es bei solchen Java-Programmen oft Peaks, bei denen sich CPU-Auslastung und Speicherverbrauch gegenseitig hochschaukeln, und SO ETWAS will man gerade bei Spielen überhaupt nicht haben.
Frag dich einfach mal selbst, warum es keinen einzigen Triple-A-Titel mit Java gibt. Die werden alle mit C++ oder evtl. noch mit C# geschrieben.
Wobei bei C# ein ähnliches Problem wie bei Java existiert. Wenn ein C#-Spiel aber gerade mal noch so flüssig auf einem High-End-PC läuft, dann kannst du im Umkehrschluss davon ausgehen, dass das selbe Spiel mit C++ nochmal deutlich flüssiger und mit wesentlich mehr Freiraum nach oben laufen würde.
Anders herum wird ein Spiel, welches schon mit C++ hart an der Grenze ist, mit C# - und erst Recht mit Java - schlicht und ergreifend unspielbar sein, es sei denn, du stehst auf Dia-Shows. :)
Java ist zwar eine wunderbare Sprache, aber - schon allein vom Konzept und Sprachdesign her - für Spiele leider völlig ungeeignet. Klar, du wirst so etwas wie Supermario darin bauen, und auch einfache 3D-Szenen erstellen können, aber mach dir nichts vor: Früher oder später MUSST du zu C++ wechseln, falls du grafisch aufwändige Spiele entwickeln willst. (Oder auch C#, allerdings mit Abstrichen!)
Wenn du jetzt, mit dem Hauptziel "Spieleprogrammierung" Java lernst, dann garantiere ich dir, dass du dir später selbst in den Hintern beißen wirst, wegen der verschwendeten Zeit.
Du kannst zwar irgendwelche Engines nehmen, und deren API-Aufrufe mit Java (oder sogar Python) zusammen kleben, aber du wirst damit immer auf relativ niedrigem Niveau rumfrickeln und Programmiertechnisch nie richtig "Erwachsen" werden.
Wenn man die Sinnhaftigkeit aber mal außer Acht lässt und sich rein auf die Realisierbarkeit fokussiert, wäre es dann möglich, Titel wie Black Ops 4 Oder Battlefield 5 von Grund auf und einzige in Java zu schreiben?
Nein, völlig unmöglich. An so etwas wird auch den nächsten zich Jahren kein Weg an C++ vorbei führen.
Wie gesagt, du kannst einfache Spiele mit Java schreiben, aber vergleiche mal die Demos der gängigen Java-3D-Engines mit den von dir genannten Titeln. Da liegen Welten dazwischen!
Wie sähe es mit CAD-Anwendungen aus? Könnte Software, die mit Blender oder Photoshop verglichen werden kann, in Sprachen wie Java geschrieben werden?
Wenn die Software am Ende auch angenehm benutzbar sein soll, dann nicht. Falls du als Anwender ewig lange Wartezeiten und extremen RAM-Verbrauch gewöhnt bist, dann ja, allerdings mit Ausnahme von Blender, wofür Java wieder einfach zu ungeeignet ist.
Könnte man solche Projekte auch ohne größere Performanceeinbußen realisieren?
Nein, wie oben beschrieben, wird der RAM-Verbrauch durch die Decke gehen, und die CPU dein Arbeitszimmer auch im Winter schön warm halten. :)
Kann man das noch einigermaßen in Kauf nehmen?
Nein, bei den von dir genannten "Softwaren" ist die Grenze zum Zumutbaren bei weitem überschritten. So etwas schreibt man einfach nicht mit Java.
Mir geht es bei der Frage im Grunde genommen darum, mich endlich zu entscheiden welche Programmiersprache ich lernen möchte.
Im Idealfall beide, Java UND C++, denn nur so kannst du dir ein Bild machen. Außerdem steht in allen Java-Büchern und -Tutorials gleich in der Einleitung immer wie toll performant Java doch ist und dass alle anderen Behauptungen nicht wirklich zutreffend sind. Als reiner Java-Entwickler gewöhnt man sich dann tatsächlich daran, und empfindet Java-Programme oft nicht mehr als sooooo langsam, wie sie in Wirklichkeit sind.
Irgendwann wirst du dann tolle "Tricks" lernen, mit denen man die Geschwidigkeit erhöhen kann, evtl. Dinge wie "Excelsior Jet" nutzen, und dir ständig selber einreden, dass es ja "alles nicht so schlimm" und eigentlich immer noch "ganz gut" ist.
Am Ende sitzt du dann da mit einer fetten Laufzeitumgebung, verglichen mit C++-Programmen exorbitant hohem RAM-Verbrauch, schmutzigen Hacks um die Geschwndigkeitsprobleme doch noch irgendwie in den Griff zu bekommen und machst dir selbst vor, dass die tagelangen Suchen nach Workarounds bei Performance-Problemen die Symptome "ausreichend gelindert" (aber eben nicht "behoben") haben.
Relativ schnell wirst du dann nicht mehr weiter kommen, weil nach oben hin eben keine Luft mehr zum atmen ist, und deine Software bei 95% RAM-Verbrauch auf 100% CPU läuft. Und das ist dann der Moment, an dem du dir denken wirst: "Hätte ich bei der Spieleprogrammierung doch lieber gleich auf etwas Richtiges gesetzt". Und dann wirst du höchstwahrscheinlich aufgeben oder - auch wenn die Wahrscheinlichkeit dazu sehr gering ist - dich nochmal zusammen reißen, und C++ von Anfang an richtig lernen.
Wie gesagt, Java ist ne super Sprache und damit kann man verdammt viele Dinge tun. Aber Spiele, Photoshop, CAD, Blender, etc. gehören eindeutig nicht dazu. Und nur weil "es geht" und es den ein oder anderen Proof-of-Concept dazu gibt, heißt es noch lange nicht, dass es so ordentlich oder vernünftig ist.
Java hat VIEL mehr Overhead als C++, und zwar in einem Maße, dass sich nicht kleinreden lässt. Dummerweise kommt es aber genau DARAUF an, bei Spielen oder grafisch aufwändiger Software.
Fazit: Du willst ganz eindeutig C++ lernen und Java NICHT nutzen, für das, was du vor hast! ;)
Und lass dich nicht von Pseudo-Benchmarks beeindrucken, welche die tausendste Fibonacci-Folge in Java und in C++ vergleichen, wobei Java "fast so gut" wie C++ sein wird. Solche Tests sind völlig unrealistisch und verzerren die Realität. Am Ende wird Java - realistisch betrachtet bei "echten" Herausforderungen - immer um den Faktor 10 bis 100 langsamer sein als C++. Da beißt die Maus keinen Faden ab. :)
Oh, dein Fragetext war ja noch gar nicht zu Ende ... dann mal weiter im Text ...
Aus zeitlichen Gründen und auch deshalb, weil es mich hinsichtlich meines Berufes überhaupt nicht tangiert möchte ich mich auf eine einzige Sprache beschränken und das dafür richtig machen.
Dann verschwende deine Zeit nicht mit Java, und fang mit C++ an, auch wenn C++ verglichen mit Java für Einsteiger merklich "fordernder" sein wird, aber es lohnt sich.
Dabei wollte ich wenn möglich eine Sprach die Alles erlaubt. Da kam mir als erstes Java in den Sinn.
Genau genommen ist C++ die Sprache, die alles erlaubt. Die Einsatzbereiche für Java liegen sehr sehr weit darunter!
Da kam mir als erstes Java in den Sinn. Läuft überall, ist der Hit, wenn es um Android geht, ...
Rein theoretisch läuft Java überall, praktisch betrachtet kannst du die gut unterstützen Plattformen an einer einzigen Hand ablesen. Denn Java läuft nur dort, wo es auch ein JRE gibt, und das sind - anders als in der Theorie - nur sehr wenige Plattformen.
Von gescheiterten Experimenten wie "Java auf Mikrocontrollern" reden wir jetzt mal nicht, denn dort gilt das bekannte "Compile once, run anywhere" überhaupt nicht mehr, weil solche Plattformen einfach zu speziell sind.
Und da du gerade von Android redest ... Spiele-Engines werden für Android in C++ geschrieben, wenn sie grafisch aufwändiger sind, weil es mit Java einfach gar nicht möglich wäre. Diese C++-Teile werden dann kompiliert, und in relativ dünnschichtige Java-Wrapper eingebettet, sodass du dein Spiel am Smartphone nutzen kannst. Für eines der gefühlt vielen millionen Memory-Spiele oder einen Poker-Klon brauchst du natürlich keine C++ Engine auf deinem Android gerät, aber bei allem was darüber hinaus geht schon ... vorausgesetzt, dich kümmert die Akkulaufzeit der Geräte deiner Nutzer und deren Temperatur. (Also die Temperatur der Geräte, nicht der Nutzer!) :)
Ein Treiber in Java, wäre das überhaupt möglich?
Ohne da jetzt auf technische Details einzugehen: Realistisch betrachtet, Nein. :)
Hier haben Sprachen wie C++ tatsächlich die Nase vorne, aber auch da hat man, in den Bereichen wo Assembler eingesetzt wird, Grenzen.
In den 90ern habe ich meinen C++ Code noch hin und wieder mit Inline-Assembler "aufgehübscht", aber das ist heutzutage (fast) nicht mehr nötig.
Im Grund genommen ist das, wonach ich suche wahrscheinlich genau C++, ...
Das hast du richtig erkannt. In deinem Fall führt kein Weg an C++ vorbei.
... man kann sich ja, soweit ich weiß, auch selbst Laufzeitumgebungen basteln oder mit virtuellen Maschinen arbeiten, so dass der Großteil vom Code auch systemübergreifend funktioniert.
C++ Compiler gibt es für VIEL mehr Plattformen, als es JREs für Java gibt. Da mach dir um die Portabilität mal keine Gedanken.
Und das mit den "virtuellen Maschinen" hast du evtl. etwas falsch verstanden. Damit sind in erster Linie keine Dinge wie VMware oder VirtualBox gemeint, sondern ein Entwurfsmuster. Eine VM in C++ zu schreiben geht auf unter 100 Zeilen Code, vorausgesetzt es ist eine recht einfache.
Je nach Anforderung sind VMs in C++ höchst performant und werden gerade bei Spielen gern eingesetzt, um Dinge zu automatisieren, die in einer "geschlossenen Umgebung" lauffähig sein sollen.
Nebenbei bemerkt kannst du genauso gut in Java eine VM bauen, was ich auch schon oft getan habe. Wie gesagt, da ist nichts magisches dran. Es ist einfach nur eine Herangehensweise, ein Problem zu lösen. :)
Ich finde an C++ einfach nichts schlechtes. Allerdings hat mich schon der erste Blick in ein C++ Buch vollständig demotiviert.
Wenn du als Anfänger ein Fachbuch in der Mitte oder weiter hinten aufschlägst, wirst du grundsätzlich nichts verstehen, völlig unabhängig vom Thema (auch über die Programmierung hinaus).
Aber dafür sind Lehrbücher ja da: Dass sie dir Dinge von Anfang an, Schritt für Schritt, erklären.
Deshalb lass dich nicht von den hinteren Kapiteln schockieren, sondern fang beim Vorwort an, und arbeite dich dann Seite für Seite voran. Irgendwann bist du mit dem Buch durch, und wunderst dich, warum du vorher so große Angst davor hattest. :)
Es scheint mir so, als sei es um einiges schwieriger als Java, alleine schon was die Syntax angeht...
Die Syntax bei C++ bietet viel mehr Optimierungspotential als bei Java, und legt dir damit ein sehr mächtiges Werkzeug in die Hand.
Aber das tolle ist: Du musst dieses Werkzeug nicht nutzen, wenn es dich - zumindest am Anfang noch - überfordert.
Und was noch toller ist: Viele syntaktische Konstrukte sind einfacher und kürzer als bei Java! Allein die Mögilchkeit, Operatoren zu überladen, erlaubt dir, wesentlich lesbareren Code zu schreiben. :)
Außerdem ist weder Java, noch C++, für Anfänger entwickelt worden, sondern für Leute, die diese Sprachen größtenteils im Blut haben und damit gut umgehen können.
Und jemand der gut C++ kann, wird C++ Code auch lesen können. Genauso wie jemand, der gut Java kann, auch Java-Code lesen kann.
Du lernst die Sprachen ja nicht, um dein Leben lang Anfänger zu bleiben, sondern um damit "professionell arbeiten" zu können. Und so jemand hat auch keine Probleme mit der Syntax, auch wenn es für ihn als Anfänger früher mal alles furchtbar kompliziert erschien. :)
Lohnt es sich, wenn man sich den Weg zu aufwendigen Anwendungen offen halten möchte, C++ zu lernen, oder sind die Defizite von Java so gering, dass man es sich beim Lernen leichter machen sollte.
Für das, was du unter "aufwendigen Anwendungen" verstehst, hast du gar keine andere Wahl als C++, von daher stellt sich die Frage gar nicht.
Falls du wirklich versuchen solltest, so etwas mit Java zu realisieren, wirst du am Ende mit einer aufgeblasenen, von Abhängigkeiten strotzenden, langsamen, Speicher fressenden, im besten Falle "mittelmäßigen" Anwendung stehen.
Wenn du natürlich nur ein einfaches ERP-System mit Datenbankanbindung für ein mittelständisches Unternehmen bauen willst, kannste gerne Java nehmen. Dabei machen sich die Nachteile dieser Sprache / Laufzeitumgebung kaum bemerkbar, aber AAA-Titel? Das wird nix werden! ;)
... oder sind die Defizite von Java so gering, dass man es sich beim Lernen leichter machen sollte.
Wie gesagt, Java lernen lohnt sich in jedem Falle! Aber da du ja angibst wenig Zeit zu haben und nur eine Sprache wählen kannst, fällt Java leider weg, auch wenn es leichter als C++ sein wird, aber für dein Vorhaben eben alles andere als geeignet ist. :)
So, das war mein Roman zu dem Thema! ;)
Du musst jetzt selbst entscheiden, wofür du dich entscheidest.
Viel Spaß damit, was auch immer du tun wirst! ;)