Warum gibt es kaum 3D Spiele in Java?

...komplette Frage anzeigen

6 Antworten

Der Grund ist der allgemein deutlich effizientere Umgang mit Ressourcen.

In Java verbrät ...

int arr[] = new int[2];

... insgesamt etwas mehr als 64 Byte. Es gibt keine andere Möglichkeit, als Arrays auf dem Heap zu allozieren, was jedes mal aufs neue den Memory-Menager anschmeißen wird. Darüber hinaus müssen intern an mehreren Stellen Zeiger und eine interne Zählvariable vorgehalten werden. (So in der Art von std::shared_ptr unter C++, was aber nur 24 Byte RAM benötigt.)

Außerdem wird das array zwangsweise mit Nullen gefüllt, egal ob man will oder nicht. (Ist z. B. bei Puffern sinnlose Zeitverschwendung!)

Darüber hinaus ist nicht vorhersehbar, wann der GC ungenutzte Objekte aufräumen wird.

Ach so, und der obige Aufruf frisst im besten Falle unter Optimalbedingungen 50 bis 100 Takte, allerdings sind 500 bis 1500 realistischer, es kann aber auch leicht über 2000 Takte anwachsen.

Bei C++ würde man hingegen Folgendes schreiben:

int arr[2];

Das verbraucht insgesamt nur 8 Byte auf dem Stack und exakt Null Taktzyklen! (Im Kompilat ist diese "Reservierung" tatsächlich nicht mehr vorhanden!)

Falls man unbedingt eine Null-Initialisierung (wie bei Java) wünscht, kann man aber ...

int arr[2] {};

... schreiben, und es wird exakt ein halber bis ein ganzer CPU-Takt (eine 64 Bit XOR Instruktion) benötigt. Am RAM-Verbrauch ändert sich nichts.

Vergleiche also mal Java mit C++ in diesem simplen Beispiel:

  • Java: im Schnitt ca. 200-700 Takte und ca. 64 Byte Speicher
  • C++: im Schnitt ca. 0-1 Takte und exakt 8 Byte Speicher

Und das ist nur EIN Beispiel! Das Kopieren und Verschieben von Objekten ist in C++ dank RValue-Referenzen nochmal deutlich effizienter, als es in Java möglich wäre.

Klassen sind nicht zwangsweise virtuell und du kannst sehr leicht mit CRTP Vererbung zur Kompilierzeit ohne Laufzeitoverhead realisieren. (D. h. bei Java gibt es mindestens zwei Zeigerindirektionen, wenn du eine Methode aufrufst, bei C++ nur eine einzige, es sei denn, ein anderes Verhalten ist ausdrücklich erwünscht! Eine Indirektion ist ein Sprung, und die verbraten gerne mal 200 Takte. Bei C++ sparst du also bei vielen Methodenaufrufen ganz nebenbei eben genau diese Anzahl Takte ein!)

Dann gibt es noch das mächtige Template-System bei C++, was den Generics von Java haushoch überlegen ist. In Kombination mit konstanten Ausdrücken kann man damit zur Kompilierzeit komplexe Wertetabellen "vorberechnen", was bei Java nicht geht und a) beim Programmstart durch eine Initialisierungsmethode erledigt werden muss oder b) durch ein Tool generiert als Tabelle mit "magischen Werten" vorgeneriert werden muss.

Nichtsdestotrotz hat Java natürlich auch seine Daseinsberechtigung und GUIs mit JavaFX machen mir persönlich mehr Spaß als mit Qt, aber gerade im Punkto Ressourcenverbrauch fällt mir jetzt nichts ein, bei dem Java auch nur in die Nähe von C++ kommen würde.

Vor allem bei Spielen kommt es ja auf Ressourcen an! Minecraft ist jetzt zwar nicht schlecht, aber es sieht nicht ohne Grund so aus, wie es aussieht, auch wenn man es mit viel Mühe noch aufhübschen kann.

Egal wie leistungsfähig ein Rechner ist, aber 10 mal weniger Speicherverbrauch wird RELATIV immer 10 mal weniger Speicherverbrauch bedeuten, ganz egal ob es sich um 4GB, 8GB oder 16GB handelt.

Und vor allem die Garbage Collection hat ihren hohen Preis: Beim Zerstören eines Objektes wird nochmal ungefähr 50% zusätzlicher Speicherplatz benötigt. Wird obiges Integer Array also zerstört, steigt der benötigte Speicherbedarf kurzzeitig auf ca. 96 Byte an.

Die Objektzerstörung muss also NOCHMAL das Speichermanagement bemühen (sprich einige Funktionen aufrufen, temporären Speicher reservieren und diesen auch sofort wieder frei geben).

Von daher wird eine C++ Spieleengine immer effizienter als eine Java oder auch C# Engine sein. Natürlich gibt es auch gute Java und C# Engines, aber ein gleichartiger Aufbau in C++ wird immer merklich besser sein!

Java ist so gefühlte 100 mal langsamer , den es ist auch nur eine interpreter sprache , zwar schon auf einem hohen niveau , aber es ist halt extrem langsam

was wir ja auch an minecraft sehen , als das noch nciht auf die graka gemapped wurde war es ulta langsam auch auf einem highend gerät

jetzt ist es immer noch langsam sobald du viele addons hast kann man es wegschmeissen .

c++ ist und bleibt sehr schnell den es wird direkt in maschinensprache umgesetzt und nicht erst in ein zwischencode (bytecode) somit läuft es direkt im CPU und nicht erst durch eine andere software .

Java ist für kleinkram wie bei händy apps , aber da wo es richtig abgeht ,

da brauchste maschinen code .

würdest du GTA5 in Java Programmieren dann köntest du dem schlag zusehen und dabei noch ein kaffee trinken .

Minecraft ist dazu auch noch sehr sehr sehr schlecht gecodet, dafür ist Java aber besser was Ingame timing geht.

0
@bloedie16

ich glaub richtig geproggt wäre das mit c++ auch kein problem ausser jemand meint sich bei anderen runtimes bedienen zu müssen . bedenken wir doch , das letzendlich die  java umgebung  selbst auch nur in maschinen code läuft.

0

Dadurch, dass Java nicht direkt Maschinencode erzeugt, sondern in der JVM läuft, die dann nochmal übersetzen muss, ist es prinzipiell weniger performant und langsamer. Und das ist bei grafikhungrigen Anwendungen wie 3D-Spielen das K.O.-Kriterium.

Performance und Performance. Im Gegensatz zu Java bietet C/C++ die Möglichkeit den Speicher effektiver zu nutzen und zu manipulieren.

Deshalb sind Java Spiele auch viel Resourcenhungriger. abgesehen davon brauchen Java Programme immer eine virtuelle Umgebung um betrieben zu werden, wodurch wieder die performance drunter leidet.

Java kann doch selber mit Bits arbeiten :D -》Datentypen

0
@egla666

In Java hast du einen "Garbage collector" der alle x Zeiteinheiten überprüft, ob du deine erstellten Objekte noch brauchst, 

In C/C++ musst du dir für jedes Objekt selber soviel Speicher reservieren wie du brauchst und den dann später wieder freigeben.

0
@egla666

Solltest du dich eher für Android-Spiele Programmierung interessieren, was ich aus libGDX schließe, dann wird Java dort sicherlich relevant bleiben, da es zurzeit die "Hauptsprache" für Android Anwednungen ist. 

Wobei Kotlin in letzter Zeit auch immer beliebter wurde. Vor allem jetzt wo Android Kontlin jetzt offiziell unterstützt und libGDX ebenfalls Kotlin unterstützt.

0

Warum gibt es kaum 3D Spiele in Java?

Weil java langsam wie eine Schnecke ist.


Trotzdem sind fast alle Spiele in C++ geschrieben. Aber warum?

weil u.a. der Kode schon gelinkt ist und nicht erst noch interpretiert werden muss.


Weil es C++ gibt, wesentlich stabiler und Sicherer, schneller... siehe Minecraft... Es ist performancetechnisch eher meh und naja.. Minecraft ist glaube ich das beste Beispiel wieso man Spiele in C++ Programmieren sollte!


Was möchtest Du wissen?