Warum sind nur wenige Videospiele in Java geschrieben? [geschlossen]

171

Warum sind nicht viele kommerzielle 3D-Videospiele (keine zufälligen Open-Source-2D-Videospiele) in Java geschrieben? Theoretisch macht es sehr viel Sinn: Sie erhalten eine Produktivitätssteigerung und eine plattformübergreifende Anwendung fast kostenlos, unter anderem wie die große Anzahl an Java-Bibliotheken und die integrierte Speicherbereinigung (obwohl ich zugeben muss, dass ich ' Ich bin mir nicht sicher, ob Letzteres eine gute Sache ist. Warum wird es selten verwendet? Ich kann mir nur ein paar beliebte kommerzielle Spiele vorstellen, die für die Java-Plattform geschrieben wurden.

Liegt es an der Leistung? Wenn ja, würde der größte Teil des schweren Hebens nicht von der GPU ausgeführt werden?

Sasha Chedygov
quelle
1
Re: mmyers; Ich bin etwas geschockt, dass DIESES Spiel sogar 2005 die Auszeichnung "Beste Grafik" erhalten hat ...
CloudyMusic
2
Ja, aber die meisten "echten Spiele" werden nicht in verwaltetem .net erstellt, oder? Sie sind in Old School C / C ++ gemacht?
Hardwareguy
14
Runescape ist in Java geschrieben.
GameFreak
44
Minecraft ist in Java geschrieben!
DaGrevis

Antworten:

155

Die Welt der Spieleentwicklung ist lustig: Einerseits akzeptieren sie oft schnell neue Ideen, andererseits befinden sie sich noch in der Steinzeit.

Die Wahrheit ist, dass es selten so viele Anreize gibt, auf .NET / Java / etwas anderes als C / C ++ umzusteigen.

Die meisten Spielefirmen lizenzieren Teile der Spiele-Engine von anderen Firmen. Diese Teile sind in C ++ geschrieben, und obwohl Sie möglicherweise Zugriff auf die Quelle haben, um sie zu portieren, ist dies sehr aufwändig (und natürlich muss die Lizenz dies zulassen).

Außerdem ist in C ++ bereits viel Legacy-Code vorhanden. Wenn Code aus früheren Projekten wiederverwendet werden kann (z. B. wenn Sie eine Fortsetzung schreiben), ist dies umso wichtiger, wenn Sie sich an dieselbe Sprache halten, anstatt ihn in einer neuen Sprache neu zu schreiben (mehr, da Sie ihn wahrscheinlich wieder einführen werden) Eine Menge Fehler, die Sie zum Ausbügeln benötigen.

Schließlich ist es sowieso selten, dass Spiele in 100% C ++ geschrieben werden - es wird viel mit Skriptsprachen getan, egal ob sie benutzerdefiniert sind oder nur eine vorhandene Sprache integrieren (Lua ist heutzutage eine der beliebtesten).

Was die Speicherbereinigung betrifft, kann dies ein Problem sein. Das Problem ist nicht so sehr, dass es existiert, sondern vielmehr, wie es funktioniert - der Garbage Collector MUSS nicht blockieren (oder zumindest nur sehr kurz blockieren), da es einfach inakzeptabel ist, das Spiel 10 Sekunden lang einfrieren zu lassen Es durchsucht den gesamten zugewiesenen Speicher, um festzustellen, was freigegeben werden kann. Ich weiß, dass Java beim GC'ing dazu neigt, ziemlich zu ersticken, wenn fast der Speicher knapp wird (und bei einigen Spielen wird dies der Fall sein).

Sie sind auch etwas eingeschränkter in Ihren Möglichkeiten: Sie können die Hardware aufgrund des Overheads der Laufzeit nicht vollständig ausnutzen. Stellen Sie sich vor, Crysis wird in Java geschrieben ... selbst wenn dies der einzige sichtbare Unterschied ist, wäre es nicht der gleiche (ich bin mir auch ziemlich sicher, dass Sie einen Core i7 benötigen würden, um es auszuführen.).

Das bedeutet nicht, dass diese Sprachen nicht ihren Platz in der Spieleentwicklung haben - und nein, ich beziehe mich nicht nur auf die Tool-Programmierung. Für die meisten Spiele benötigen Sie nicht die zusätzliche Leistung, die Sie von C ++ erhalten, einschließlich 3D-Spielen. Wenn Sie alles von Grund auf neu schreiben, kann es durchaus sinnvoll sein, etwas wie XNA zu verwenden - tatsächlich gibt es eine gute Chance wird es.

Was kommerzielle Spiele betrifft - zählt RuneScape ? Das ist vielleicht das erfolgreichste Java-Spiel da draußen.

Michael Madsen
quelle
16
Natürlich würden Sie Crysis nicht auf der JVM ausführen. Zur Hölle, wenn Sie dieses Spiel in Assemblersprache codiert haben, benötigen Sie immer noch einen Supercomputer, um es mit den vollständigen Einstellungen auszuführen. Aber +1 für den hervorragenden Einblick, danke.
Sasha Chedygov
15
Sie können Unreal Tournament 3 oder Crysis nicht mit Runescape vergleichen. Wenn die Grafikqualität ein Problem darstellt, müssen Sie sich an eine niedrige Sprache mit möglichst geringem Aufwand halten. Natürlich ist Java für Indy oder Spiele, bei denen Grafiken nicht das Hauptverkaufsargument sind, eine hervorragende Alternative zu C / C ++.
GuiSim
6
@GuiSim: Bei den meisten Spielen ist die Grafikqualität KEIN Hauptverkaufsargument. Ich kann mir nur eine Handvoll Spiele vorstellen, die mit Blick auf Grafiken erstellt wurden (ich denke an Crysis, aber auch an Half-Life 2). Ich denke nicht, dass sich die meisten Spieleentwickler so sehr für Grafiken interessieren, solange sie "gut genug" sind (auch bekannt als gleichwertig mit den meisten anderen Spielen).
Sasha Chedygov
4
Grafiken haben wirklich sehr wenig mit der Sprache zu tun. Physik, KI, ja. Grafik, nein.
JulianR
10
@JulianR Es kann eine erhebliche Arbeitsbelastung für die Vorbereitung und Pflege einer Szene geben, die effizient gerendert werden soll, sodass die Sprache und der damit verbundene Sprachaufwand für Grafiken von Bedeutung sind.
KSchmidt
95

Ich denke, John Carmack sagte es am besten mit:

Das größte Problem ist, dass Java sehr langsam ist. Auf einer reinen CPU- / Speicher- / Anzeige- / Kommunikationsebene sollten die meisten modernen Handys wesentlich bessere Spieleplattformen sein als ein Game Boy Advanced. Mit Java haben Sie auf den meisten Telefonen ungefähr die CPU-Leistung eines originalen 4,77-MHz-IBM-PCs und eine schlechte Kontrolle über alles. [... snip ...] Einmal schreiben - überall ausführen. Ha. Hahahahaha. Wir testen derzeit nur auf vier Plattformen, und kein einziges Paar hat genau die gleichen Macken. Alle kommerziellen Spiele werden für jede (oft über 100) Plattform individuell optimiert und kompiliert. Portabilität ist keine Rechtfertigung für die schreckliche Leistung.

( Quelle )

Zugegeben, er sprach über mobile Plattformen, aber ich habe ähnliche Probleme mit Java als Ganzes gefunden, die aus einem C ++ - Hintergrund stammen. Ich vermisse es, Speicher auf dem Stapel / Heap zu meinen eigenen Bedingungen zuzuweisen.

Marc
quelle
60
Dieses Zitat stammt aus dem Jahr 2005. Sowohl die Java-Technologie als auch die Leistung von Mobiltelefonen haben sich seitdem erheblich verbessert. Beim Vergleich von Handy-Spielen mit PC-Spielen werden Äpfel mit Orangen verglichen.
Chris Dail
78
John Carmack hat es gesagt. Fall abgeschlossen.
GuiSim
41
Ich werde nur unruhig, wenn ich lese "Java ist wirklich langsam". Es ist, als würde man sagen, ein 50.000-Dollar-Sportwagen sei langsam im Vergleich zu einem 100.000-Dollar-Sportwagen. Sicher, es ist langsamer, aber in 90% der Fälle ist die Arbeit immer noch großartig und kostet die Hälfte;) Kein Flammenkrieg beabsichtigt. Ich bin damit einverstanden, dass die oben genannten Gründe dafür verantwortlich sind, dass Crysis und ähnliche Spiele nicht in Java geschrieben sind.
Ross
17
@ Chris Dail, dies unterstreicht das gesamte Problem mit der Java-Leistung. Hat sich die Java-Leistung verbessert? Nein, Handys sind jetzt noch schneller. Spiele sollen die Grenzen des Realismus und damit die Grenzen der Hardware überschreiten und% 30-% 40 Ihrer Leistung wegwerfen, bevor Sie überhaupt eine Codezeile geschrieben haben, ist inakzeptabel.
CGP
8
Ich finde diesen Streit sehr seltsam. Java ME ist nicht dasselbe wie Java in Android und auch nicht dasselbe wie Java auf PCs. Java ME verließ sich normalerweise auf Telefonhersteller, um eine JVM zu entwickeln. Einige haben gute Arbeit geleistet, andere nicht. Kein Wunder, dass Carmack sich über sie beschwerte. Android hat eine eigene VM, die keine JVM ist. Und es gibt einige schwerwiegende Probleme (aus meiner Sicht). Die HotSpot-VM von Oracle unterscheidet sich vollständig von beiden Fällen. Wenn die Leute all diese Dinge vergleichen, kann ich nur schließen, dass sie nicht wissen, wovon sie sprechen.
Malcolm
54

Zum einen macht Javas mangelnde Überladung von Operatoren die gesamte Mathematik, mit der Sie sich befassen müssen, um eine funktionierende Grafik-Pipeline zu erhalten, sehr, sehr ärgerlich und schwer zu lesen.

Alle Matrixmultiplikations- und affinen Vektoren, mit denen Sie sich befassen müssen, sind viel einfacher zu verfolgen, wenn sie sich in wohlgeformten mathematischen Ausdrücken befinden und nicht in objektorientierten Ausdrücken wie

product = vector.multiply(projectionMatrix).dotProduct(otherVector);

Das ist einfach schrecklich. Mathe sollte nicht so aussehen.

Welbog
quelle
19
Ich erinnere mich, dass einige der Designer von Sun 1996 in Berkeley eine Präsentation über Java gehalten haben. William Kahan ( en.wikipedia.org/wiki/William_Kahan ) gab ihnen genau dieses Problem. :)
JP Alioto
13
Ich denke, es gibt einen guten Grund, das Überladen von Operatoren in einer Sprache nicht zuzulassen: um zu verhindern, dass Leute sie verwenden. Es ist ein mächtiges Werkzeug und für Mathematik sehr cool, aber für alles andere gefährlich. Faul wie Codierer sind, neigen sie dazu, ihn zum Verkürzen von Code zu missbrauchen, und sobald Leute anfangen, eine Karte auszuführen, die eine Iterierbarkeit mit einer Funktion multipliziert, oder selbst wenn alle arithmetischen Operationen für Funktionen definiert sind, ist die Lesbarkeit des Codes im Begriff, 0 zu erreichen Ja, ich habe viel Zeit damit verbracht, solchen Code zu portieren. : -S es ist eine Designwahl. und Designentscheidungen sind immer umstritten.
back2dos
19
Alle anderen für ein paar schlechte Äpfel bestrafen? Dies ist ein Grund, warum ich C # bevorzuge. Wenn ich wirklich eine Überlastung des Bedieners brauche, ist sie da.
ChaosPandion
1
Grundsätzlich ist die Überladung von Operatoren nur für 2-3 verschiedene Situationen im OOP-Design (Vektoren, Matrizen, komplexe Zahlen) wirklich geeignet. In den meisten anderen Situationen ist es zu locker definiert und führt nur zu schlampigem Code, schwacher Syntax und schlechter Dokumentation, selbst von Leuten, die wissen, wie man es benutzt. Ich denke, deshalb hat Sun beschlossen, es nicht in Java zu verwenden, und ich denke, das ist eine gültige Entscheidung.
Bgroenks
1
@MMJZ: Was haben Lambda-Ausdrücke mit Operatorüberladung zu tun?
Sasha Chedygov
26

Ich denke, .NET hatte (hat) viele der gleichen wahrgenommenen Probleme wie Java. Microsoft hat gerade beim Marketing für Entwickler mit XNA bessere Arbeit geleistet :-)

Joel Martinez
quelle
10
Mit XNA können Sie Ihre .NET-Anwendung auch für XBox bereitstellen. Ich habe noch nichts so reibungsloses für Java gesehen.
StriplingWarrior
Sie können auch auf dem Zune bereitstellen.
Cbeuker
Eine etwas ältere Frage, aber nur zum Aktualisieren können Sie jetzt auch XNA-Spiele für Windows Phone schreiben :-)
Joel Martinez
3
@ JoelMartinez ein weiteres Update: Es ist nicht möglich, XNA-Spiele für Windows Phone 8 zu schreiben.
Tomas Andrle
@ Toma Es ist jetzt möglich, Monogame-Spiele für WP8
Alex Lapa
17

Kleinere Punkte zuerst:

  • Jede Produktivitätssteigerung durch Java ist hypothetisch. Die Syntax ist fast identisch mit C ++, sodass Sie wirklich nur auf Einsparungen durch Speicherverwaltung und Standardbibliotheken setzen. Die Bibliotheken haben Spieleentwicklern wenig zu bieten, und die Speicherverwaltung ist aufgrund der Speicherbereinigung ein umstrittenes Thema.

  • plattformübergreifend "kostenlos" ist nicht so gut wie Sie denken, da nur wenige Entwickler OpenGL verwenden möchten und einigen wichtigen Plattformen wahrscheinlich eine gute Java-Implementierung oder Wrapper für ihre nativen Bibliotheken fehlen, sei es für Grafik, Audio, Netzwerk usw.

Das Problem ist jedoch hauptsächlich die Abwärtskompatibilität. Spieleentwickler wechselten von C zu C ++ und von Assembly zu C, nur weil die Migrationsroute reibungslos verlief. Jeder arbeitet eng mit dem vorherigen zusammen, und der gesamte vorherige Code konnte in der neuen Sprache verwendet werden, häufig über einen einzigen Compiler. Daher war die Migration so langsam oder so schnell, wie Sie möchten. Zum Beispiel haben einige unserer alten Header, die heute verwendet werden, noch #ifdef WATCOMCIch glaube nicht, dass hier in einem Jahrzehnt oder länger jemand den Watcom-Compiler verwendet hat. Es gibt eine massive Investition in alten Code und jedes Bit wird nur bei Bedarf ersetzt. Dieser Prozess des Ersetzens und Aktualisierens von Teilen von einem Spiel zum nächsten ist bei weitem nicht so praktisch, wenn Sie zu einer Sprache wechseln, die nicht nativ mit Ihrem vorhandenen Code zusammenarbeitet. Ja, C ++ / Java-Interoperabilität ist möglich, aber im Vergleich zum einfachen Schreiben von "C mit etwas C ++" oder Einbetten von ASM-Blöcken in C sehr unpraktisch.

Um C ++ als bevorzugte Sprache der Spieleentwickler richtig zu ersetzen, muss es eines von zwei Dingen tun:

  1. Einfache Interoperabilität mit vorhandenem Legacy-Code, wodurch Investitionen erhalten bleiben und der Zugriff auf vorhandene Bibliotheken und Tools erhalten bleibt
  2. Zeigen Sie nachweislich genug von einer Produktivitätssteigerung, dass die Kosten für das Umschreiben Ihres gesamten Codes (oder das Überarbeiten der Schnittstellen zu wiederverwendbaren Komponenten, die in dieser Sprache verwendet werden können) mehr als gedeckt sind.

Subjektiv glaube ich nicht, dass Java beides erfüllt. Eine höhere Sprache könnte die zweite treffen, wenn jemand mutig genug ist, der Pionier zu sein. (EVE Online ist wahrscheinlich das beste Beispiel dafür, dass Python verwendbar ist, verwendet jedoch eine Abzweigung der Hauptsprache Python, viele C ++ - Komponenten für die Leistung, und selbst das ist in moderner Hinsicht ein ziemlich anspruchsloses Spiel.)

Kylotan
quelle
Ich wollte nur hinzufügen, EVE Online ist eine "Online" -Raumsimulation, bei der 1000-gegen-1000-Spieler-gegen-Spieler-Kämpfe üblich sind, was in Bezug auf die Leistung als anspruchsvolles Szenario angesehen werden kann. Obwohl die geschwindigkeitsintensiven Teile in C / C ++ geschrieben sind, ist es immer noch eine interessante Studie über die Herausforderungen bei der Verwendung einer Hochsprache (Python) in Spielen.
Hakan Deryal
Denken Sie jedoch daran, dass die Leistung in serverseitigen Multiplayer-Spielen anhand geringfügig anderer Messgrößen gemessen wird als die Leistung in clientseitigen Einzelspieler-Spielen. Ersteres befasst sich mehr mit dem Durchsatz, letzteres mit der Latenz.
Kylotan
Ja, das stimmt, aber diese Kämpfe umfassen mehr als 2000 Schiffe auf dem Bildschirm mit mehr als 2000 Projektilen (Raketen, mit Animationen), Explosionen usw., was eine hohe Grafikleistung erfordert. Trotzdem, danke für die ausführliche Antwort, es gilt immer noch.
Hakan Deryal
1
Wenn Sie der Meinung sind, dass die C- und Java-Syntax identisch ist und daher eine gewisse Beziehung zur Leistung besteht, verstehen Sie wirklich nicht, was vor sich geht. Wie könnte C möglicherweise zur Laufzeit entscheiden, dass eine bestimmte Funktion wiederholt mit denselben Parametern aufgerufen wird, und den gesamten Funktionsaufruf durch eine Konstante ersetzen, während der Funktionsaufruf beibehalten wird, wenn eine Abweichung in den Parametern vorliegt? Ich sage nicht, dass die Laufzeit immer besser oder immer schlechter ist, nur dass sie keinerlei Beziehung zur Syntax hat!
Bill K
1
@ BillK - Sie scheinen falsch verstanden zu haben. Ich erwähnte die Syntax nur in Bezug auf "Produktivität" - nicht in Bezug auf "Leistung". Es ist wahr, dass JIT-Optimierungen Java theoretisch schneller machen könnten, aber dies tritt in der Praxis nicht auf, zumindest nicht in Spielesoftware.
Kylotan
12

Ich spiele die Sims 3 und habe ein bisschen herumgestochert. Die Grafik-Engine ist C ++, während die Scripting- und Verhaltens-Engine C # / Mono ist. Während C ++ für zeitkritische Dinge da ist, sind andere Dinge wie Interaktion, Spielelogik und KI in einer objektorientierten verwalteten Sprache.

John Simon
quelle
5
und dann schieben sie für die Mac-Version das Ganze in eine modifizierte virtuelle Wine-Maschine. Immer noch schneller als in
reinem
10
Wine ist keine virtuelle Maschine, sondern eine Laufzeitbibliothek, die das Verhalten der Windows-Laufzeitbibliotheken nachahmt. Daher der Name (Wein ist kein Emulator).
Nate CK
2
Dies ist in Spielen sehr häufig, häufig wird Logik, die nicht zeitkritisch ist, in einer Skriptsprache geschrieben, üblicherweise Lua oder Python.
KSchmidt
Es ist jedoch nicht Vanille Mono. EA brauchte ein spezielles Team, das Vollzeit an seiner eigenen benutzerdefinierten CLR arbeitete, damit es funktionierte.
Crashworks
4
Nur eine Randnotiz, dass die Sims 3 dafür berüchtigt sind, selbst auf exzellenten Computern eine schlechte Leistung zu erbringen.
Lotus Notes
12
  • Gibt es gute Ports für Gaming-Engines / Bibliotheken?
  • Viele C / C ++ - Entwickler, insbesondere diejenigen unter Windows (wo die meisten kommerziellen Spiele geschrieben werden), sind mit Visual Studio vertraut. Es gibt keinen Vergleich in IDEs.
  • Im Allgemeinen wurde Java aufgrund seiner soliden Typisierung an Unternehmen verkauft und es wird davon ausgegangen, dass es keine Probleme mit der Speicherverwaltung gibt.
  • Und ja, Java leidet immer noch unter der Wahrnehmung, dass es langsam und die Speicherverwaltung schlecht ist, und für Spiele ist es wahrscheinlich nicht für die Aufgabe geeignet. Wie in einigen anderen Antworten angegeben, wird die Speicherbereinigung nicht ausreichen, wenn Sie mit Hochleistungsanforderungen in Echtzeit arbeiten. Videospiele bringen CPUs und GPUs an ihre Grenzen.
cgp
quelle
1
+1 für den fetten Text. Die Leute scheinen nicht zu bemerken, dass wenn Ihr Spiel mit 20 fps läuft, es oft mit 20 fps an die Hardware gebunden ist. Es will wirklich 30+ fps erreichen .. aber es kann nicht.
GuiSim
Ich denke nicht, dass es nur der GC ist, der das Problem in Bezug auf die Leistung darstellt ... und auch nicht das, was mit der langsamen Startphase verbunden ist ... es sind allgemeine Leistungsprobleme, aber das bin nur ich.
Rogerdpack
2
Ich denke, an diesem Punkt bin ich eher einverstanden als in der Vergangenheit. Die Optimierung der JVM wurde verbessert. Angesichts der Leistungsverbesserungen bei lose typisierten Sprachen wie JavaScript und anderen ist die Leistung von Java im Vergleich jedoch ziemlich unentschuldbar. Es gibt viele Entschuldiger für die Leistung von Java. (aber die wahrgenommene Leistung am Ende ist alles, was zählt) '
cgp
10

Einer der Hauptgründe, warum Java und andere Sprachen der virtuellen Maschine nicht für Spiele verwendet werden, ist die Garbage Collection. Das gleiche gilt für .NET. Die Speicherbereinigung hat einen langen Weg zurückgelegt und funktioniert in den meisten Arten von Anwendungen hervorragend. Um die Speicherbereinigung durchzuführen, müssen Sie die Anwendung anhalten und unterbrechen, um den Papierkorb zu sammeln. Dies kann zu periodischen Verzögerungen führen, wenn die Erfassung erfolgt.

Java hat das gleiche Problem für Echtzeitanwendungen. Wenn Aufgaben zu einem bestimmten Zeitpunkt ausgeführt werden müssen, ist es schwierig, dass eine automatisierte Aufgabe wie die Speicherbereinigung dies berücksichtigt.

Es ist nicht so, dass Java langsam ist. Es ist so, dass Java nicht gut in der Lage ist, Echtzeitaufgaben zu erledigen.

Chris Dail
quelle
1
Sie können jedoch Ihren eigenen Scheduler für den Garbage Collector schreiben, wenn Sie Java auf eine neue Umgebung portieren möchten. Der Speicher muss in beiden Fällen wiederhergestellt werden, und in einer Echtzeitumgebung können Sie festlegen, wann Sie Ihren GC planen möchten ... das Beste aus beiden Welten. Ich muss auf den Punkt zurückkommen, dass es nicht viel Grund gibt, Java auf eine Architektur zu portieren, um die Dinge zu tun, die Sie wollen, wenn C / C ++ diese Dinge bereits für Sie erledigt. Java glänzt an anderen Orten.
San Jacinto
5
Dies ist nicht die 1990er Jahre. Müllsammler sind jetzt ziemlich gut, wenn sie auf niedrige Pause eingestellt sind.
Tom Hawtin - Tackline
8

Ein großer Grund dafür ist, dass Videospiele häufig direkte Kenntnisse der darunter liegenden Hardware erfordern und es für viele Architekturen wirklich keine großartige Implementierung gibt. Es ist das Wissen über die zugrunde liegende Hardwarearchitektur, das es Entwicklern ermöglicht, jede Unze Leistung aus einem Spielesystem herauszuholen. Warum sollten Sie sich die Zeit nehmen, Java auf eine Spieleplattform zu portieren und dann ein Spiel über diesen Port zu schreiben, wenn Sie das Spiel einfach schreiben könnten?

Bearbeiten: Dies bedeutet, dass es mehr als ein Problem mit "Geschwindigkeit" oder "nicht die richtigen Bibliotheken haben" ist. Diese beiden Dinge gehen Hand in Hand, aber es geht eher darum, wie ich ein System wie die Zelle dazu bringe, meinen Java-Code auszuführen. Es gibt keine wirklich guten Java-Compiler, die die Pipelines und Vektoren verwalten können wie ich brauche .. "

San Jacinto
quelle
7

Leistungsprobleme sind der erste Grund. Wenn Sie die Art von hyperoptimiertem C ++ - Code in den Quake-Engines ( http://www.codemaestro.com/reviews/9 ) sehen, wissen Sie, dass sie ihre Zeit nicht mit einer virtuellen Maschine verschwenden werden.

Sicher, es gibt einige .NET-Spiele (welche? Ich bin interessiert. Gibt es einige wirklich CPU- / GPU-intensive?), Aber ich denke, es liegt eher daran, dass viele Leute Experten für MS-Technologien sind und Microsoft beim Start gefolgt sind ihre neue Technologie.

Oh, und plattformübergreifend denken Videospielunternehmen einfach nicht daran. Linux macht nur etwa 1% des Marktes aus, Mac OS einige% mehr. Sie denken definitiv, dass es sich nicht lohnt, nur Windows-Technologien und Bibliotheken wie DirectX zu sichern.

Ksempac
quelle
3
"Plattformübergreifend denken Videospielunternehmen einfach nicht daran" - Deshalb respektiere ich die Unternehmen, die dies tun, voll und ganz. :)
Sasha Chedygov
Ich bin Carmack auf jeden Fall dankbar, dass er sich sowohl plattformübergreifend als auch Open Source engagiert. Ich habe einfach gesagt, was die meisten Unternehmen denken.
Ksempac
1
Das ist richtig. Sie sehen nicht viele beliebte Videospiele, die auf Linux portiert sind. :(
Sasha Chedygov
Plattformübergreifend ist nicht nur betriebssystemübergreifend. Denken Sie an PS3, Xbox 360, Wii.
JulianR
"Sie werden ihre Zeit nicht mit einer virtuellen Maschine verschwenden." en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack baute seine eigene für die Spielelogik.
James McMahon
4

Sie können sich fragen, warum Webanwendungen nicht auch in C oder C ++ geschrieben sind. Die Stärke von Java liegt in seinem Netzwerkstapel und seinem objektorientierten Design. Natürlich haben C und C ++ das auch. Aber auf einer niedrigeren Abstraktion. Das ist nichts Negatives, aber Sie wollen das Rad nicht jedes Mal neu erfinden, oder?

Java hat auch keinen direkten Hardwarezugriff, was bedeutet, dass Sie mit der API eines Frameworks nicht weiterkommen.

Markus
quelle
Java kann nativen Code über "JNI" aufrufen
Bart van Heukelom
4
... und verlieren die Portabilität, während Sie dabei sind!
LiraNuna
1
Sie verlieren wirklich nicht viel Portabilität, wenn Sie JNI verwenden. Vorausgesetzt, Sie können die nativen Bibliotheken weiterhin auf Plattformen kompilieren, die Sie unterstützen möchten, bedeutet dies im Grunde nur, dass Sie nur 1% Ihres Codes portieren / neu kompilieren müssen und nicht den gesamten. Sie profitieren immer noch stark von der Portabilität von Java.
Bgroenks
4

Missverständnisse über die Leistung und schlechte JVM-Optimierungen sind meine Vermutung. Ich sage falsche Vorstellungen über die Leistung, weil es einige Java-Ports von C ++ - Spielen gibt, die schneller als ihre C ++ - Gegenstücke sind (siehe Jake 2). Das eigentliche Problem, IMHO, ist, dass sich viele Java-Programmierer nicht so sehr auf die neueste Leistung konzentrieren, sondern auf Benutzerfreundlichkeit und Verständlichkeit / Wartbarkeit von Code. Auf der C / C ++ - Seite codieren Sie im Wesentlichen in einer etwas höheren Assemblersprache und es ist ungefähr so ​​nah an der Hardware, wie Sie es nur können, ohne Assembler oder reinen Maschinencode zu schreiben.

illvm
quelle
Wenn es "so nah an der Hardware ist, wie es nur möglich ist, ohne in Assembly zu schreiben", kann Java es nicht schlagen, es sei denn, Ihre Codierung ist schrecklich. Je näher Sie der Hardware kommen, desto schneller werden Sie in der Lage sein.
Josh Johnson
4

Die Liste der Game Engines auf Wikipedia listet viele Game Engines zusammen mit der Programmiersprache auf, in der sie geschrieben sind.

Es sind mehrere Java-Game-Engines aufgeführt.

Wenn Sie auf einige der Links klicken, gelangen Sie zu Beispielen für Spiele und Demos, die in Java geschrieben wurden. Hier ist ein paar:

Für bestimmte Spiele und Situationen können die Kompromisse zwischen Java akzeptabel sein.

JohnB
quelle
Ich weiß , dass es Spiele gibt , die in Java geschrieben sind. Abgesehen von Minecraft und Runescape sind jedoch nur sehr wenige kommerzielle Mainstream-Spiele für die Java-Plattform geschrieben. Wie viele AAA-Titel wurden in Java geschrieben? Und warum so wenige? Daher meine Frage.
Sasha Chedygov
3

.NET hat definitiv einige der gleichen Probleme wie Java, wenn es um intensive 3D-Leistung geht. Microsoft hat auch viel mehr Zeit und Geld in die Entwicklung der Bibliotheken investiert, wenn es um die Arbeit mit 3D-Operationen geht.

(... ich persönlich denke auch, dass sie ein Bein hoch hatten, wenn es um die Magie zwischen DirectX und .NET geht)

Justin Niessner
quelle
2
  1. Java ist langsam, der größte Teil des schweren Hebens wird nicht von der GPU erledigt. Es gibt immer noch Animation, Physik und KI auf der CPU, die alle sehr zeitaufwändig sind.

  2. Java existiert nicht auf Konsolen, und Konsolen sind ein Hauptziel für kommerzielle Spiele. Wenn Sie Java auf dem PC verwenden, können Sie nicht mehr innerhalb angemessener Zeit und mit angemessenem Budget auf Konsolen portieren.

  3. Viele der erfahreneren Programmierer in der Spielebranche haben C und C ++ verwendet, lange bevor Java populär wurde. Die beiden oben genannten Punkte mögen dazu beitragen, aber ich gehe davon aus, dass viele professionelle Spielecodierer Java einfach nicht so gut kennen.

  4. Der Punkt eines anderen über Middleware oben war gut, also füge ich ihn meiner Antwort hinzu. Es gibt eine Menge Legacy-Code und Middleware, die speziell für die Verknüpfung mit C / C ++ geschrieben wurden, und zuletzt habe ich überprüft, dass Java keine gute Interoperabilität aufweist. Die Verwendung von Java für die meisten Unternehmen würde bedeuten, viel Code wegzuwerfen, von dem ein Großteil auf die eine oder andere Weise bezahlt wurde.

Dan Olson
quelle
3
Sie können JavaCL, JOCL oder APARAPI verwenden, um viel davon auf die GPU zu verlagern.
Bgroenks
2

Tatsächlich ist es für verwalteten Code sehr gut möglich, 3D-Spiele auszuführen. Das Problem sind die Back-Engines. Mit .Net gab es für kurze Zeit einen Managed DirectX-Wrapper für DirectX 9 von Microsoft. Dies war vor der Abstraktion, die jetzt XNA ist.

.Net-Spiele haben vollständigen Zugriff auf DirectX-APIs und sind ein Vergnügen. Das beste Beispiel, das ich kenne, ist www.entombed.co.uk, das in VB.Net geschrieben ist.

Auf der Java-Seite fehlt es leider ernsthaft - hauptsächlich aus dem Grund, dass DirectX nicht für Java verfügbar ist und Spieleprogrammierer die DirectX-API kennen und verstehen - warum sollten Sie noch eine andere API lernen, wenn Sie zu DirectX zurückkehren?

Foz
quelle
2

Spielemarketing ist ein kommerzieller Prozess. Verlage wollen quantifizierbare risikoarme Renditen für ihre Investition. Infolgedessen liegt der Fokus normalerweise auf Technologie-Gimmicks (mit Ausnahmen), die Verbraucher kaufen, um eine zuverlässige Rendite zu erzielen - dies sind in der Regel oberflächliche visuelle Effekte wie Blendung der Linse oder höhere Auflösung. Diese Effekte sind zuverlässig, da sie lediglich eine Erhöhung der Verarbeitungsleistung erfordern - sie nutzen die Hardware- / Moore'schen Gesetzeserhöhungen aus. Dies impliziert die Verwendung von C / C ++ - Java ist normalerweise zu stark von der Hardware abstrahiert, um diese Vorteile zu nutzen.

Daniel Collicott
quelle
1

Ich würde vermuten, dass Geschwindigkeit immer noch das Problem ist. Plattformübergreifend wird ein Problem sein, nicht wahr, da Sie nicht wissen, welche 3D-Karte verfügbar ist, wenn Sie den Code schreiben? Hat Java irgendetwas, um die automatische Erkennung von 3D-Funktionen zu unterstützen? Und ich würde vermuten, dass es Tools gibt, die das Portieren eines Spiels zwischen Wii, Xbox und PS3 vereinfachen, aber ich wette, es ist teuer.

Das ps3 hat Java über die Blue Ray-Unterstützung. Überprüfen Sie die bd-j-Site.

Lumpynose
quelle
1

Sogar Spiele, die auf der .Net-Plattform geschrieben wurden, sind häufig stark auf Geschwindigkeit wie den direkten Zugriff auf Speicher und Bus optimiert. .Net ermöglicht die Verwendung von C / C ++ und das Mischen mit höheren Sprachen wie C #.

Spieleentwicklungsstudios arbeiten häufig eng mit Hardwareanbietern zusammen, die Zugriff auf Low-Level-Schnittstellen ihrer Produkte bieten. In dieser Welt müssen Sie ASM und C für die Gerätekommunikation verwenden. Eine virtuelle Umgebung würde diese Programmteile verlangsamen.

Wie auch immer, moderne 3D-Spiele verwenden tatsächlich höhere Sprachen. Oft finden Sie die Spielelogik in Sprachen wie Lua oder Python geschrieben. Der Kern (E / A, Threads, Aufgabenplanung) des typischen 3D-Spiels wird jedoch in den nächsten 25 Jahren in einfachen Sprachen geschrieben sein oder solange Geräte selbst keine Abstraktion und Virtualisierung zulassen (was noch kommen wird).

Cafebabe
quelle
1

Ich stimme den anderen Beiträgen über die Nutzung von Elementen einer bereits vorhandenen / lizenzierten Codebasis, Leistung usw. zu.

Eine Sache, die ich hinzufügen möchte, ist, dass es schwierig ist, böse DRM-Tricks durch eine virtuelle Maschine zu ziehen.

Ich denke auch, dass es eine Hybris-Komponente gibt, bei der Projektmanager glauben, sie könnten mit C ++ stabilen / zuverlässigen Code erstellen, mit all den Vorteilen wie der absoluten Kontrolle über ihre Tools und Ressourcen, ABER ohne all die Nachteile, die ihre Konkurrenz erschweren und beeinträchtigen, weil "wir" sind schlauer als sie sind ".

JP772
quelle
0

Runescape von Jagex ist in Java geschrieben. Das Tag "Videospiel" wendet es möglicherweise nicht speziell auf ein Online-Spiel an, hat aber eine anständige Anhängerschaft.

Mark Schultheiss
quelle
Entschuldigung, aber das beantwortet meine Frage überhaupt nicht.
Sasha Chedygov
2
Die blinde Aussage der Frage führt jedoch zu der Annahme, dass KEINE Spiele in Java geschrieben sind, und weist nur auf den erfolgreichen Fall hin, wo man sich befindet.
Mark Schultheiss
0

Es wurde schon viel darüber gesprochen, man kann sogar im Wiki die Gründe finden ...

  • C / C ++ für die Game Engine und alle intensiven Sachen.
  • Lua oder Python für Skripte im Spiel.
  • Java - sehr, sehr schlechte Leistung, große Speichernutzung + es ist nicht auf Spielekonsolen verfügbar (Es wird für einige sehr einfache Spiele verwendet (Ja, Runescape zählt hier, es ist nicht Battlefield oder Crysis oder was sonst noch da ist), nur weil es solche gibt viele Programmierer, die diese Programmiersprache kennen).
  • C # - große Speichernutzung (Wird für einige sehr einfache Spiele verwendet, nur weil es ziemlich viele Programmierer gibt, die diese Programmiersprache kennen).

Und ich höre immer mehr Java-Programmierer, die versuchen, die Leute davon zu überzeugen, dass Java nicht langsam ist. Es ist nicht langsam, ein Widget auf dem Bildschirm und einige ASCII-Zeichen auf dem Widget zu zeichnen, Daten über das Netzwerk zu empfangen und zu senden (und das ist es auch) empfohlen, es in diesen Fällen zu verwenden (Manipulation von Netzwerkdaten) anstelle von C / C ++) ... Aber es ist verdammt langsam, wenn es um ernsthafte Dinge wie mathematische Berechnungen, Speicherzuweisung / -manipulation und viele dieser guten Dinge geht.

Ich erinnere mich an einen Artikel auf der MIT-Site, in dem gezeigt wird, was C / C ++ kann, wenn Sie die Sprach- und Compilerfunktionen verwenden: Ein Matrixmultiplikator (2 Matrizen), 1 Implementierung in Java und 1 Implementierung in C / C ++ mit C / C ++ - Funktionen und entsprechende Compiler-Optimierungen aktiviert, war die C / C ++ - Implementierung ~ 296 260-mal schneller als die Java-Implementierung.

Ich hoffe, Sie verstehen jetzt, warum Leute C / C ++ anstelle von Java in Spielen verwenden. Stellen Sie sich Crysis in Java vor. Es würde keinen Computer auf dieser Welt geben, der damit umgehen könnte ... + Die Garbage Collection funktioniert in Ordnung für Widgets, die gerade ein Bild zerstört haben Aber es ist immer noch zwischengespeichert und muss bereinigt werden, aber nicht für Spiele. Natürlich werden Sie bei jeder Aktivierung der Speicherbereinigung noch mehr Verzögerungen haben.

Bearbeiten : Da jemand nach dem Artikel gefragt hat, habe ich hier im Webarchiv danach gesucht. Ich hoffe, Sie sind zufrieden ... MIT-Fallstudie

Und um hinzuzufügen, nein, Java für Spiele ist immer noch eine schreckliche Idee. Vor ein paar Tagen hat eine große Firma, die ich nicht nennen werde, damit begonnen, ihren Spieleclient von Java auf C ++ umzuschreiben, weil ein sehr einfaches Spiel (in Bezug auf Grafik) i7-Laptops mit leistungsstarken Grafikkarten der Generation nVidia GT 5xx und 6xx verzögerte und heizte ( Nicht nur nVidia, hier geht es auch darum, dass diese leistungsstarken Karten, die die meisten neuen Spiele mit Max-Einstellungen verarbeiten können und dieses Spiel nicht verarbeiten können, und der Speicherverbrauch ~ 2,5 - 2,6 GB RAM betrug. Für solch einfache Grafiken braucht es eine Bestie einer Maschine.

Lilian A. Moraru
quelle
10
Sie wissen eindeutig sehr wenig über die moderne Java-Laufzeit und die virtuelle Maschine. Der Artikel, den Sie erwähnt haben, stammt höchstwahrscheinlich aus einem Jahrzehnt oder länger. Natürlich kann niemand etwas wissen, weil Sie ihn nicht zitiert haben. Ihre Wahrnehmung von Java ist veraltet.
Bgroenks
2
Ok, diese Studie beweist, dass Java für die Matrixmultiplikation in großem Maßstab an C verliert, wenn der zweidimensionale Arrayzugriff für den Zugriff auf Daten verwendet wird. Ja, das hätte ich auch erraten. Und wenn das wirklich ein Problem für Sie ist, was ich bezweifle, dann haben Sie JNI. Die Grenzen für die Überprüfung des Overheads auf Arrays summieren sich in dieser Situation, obwohl sein Java-Code hätte optimiert werden können, um die Ergebnisse erheblich zu verbessern. Ebenso stelle ich sein Verständnis von JIT in Frage, wenn er sagt: "Schnellere Kompilierung = nicht der beste generierte Code." Lesen Sie die IBM-Spezifikationen, um das Gegenteil zu beweisen.
Bgroenks
3
Java ist keine schlechte Wahl für die Spieleentwicklung. Es gibt viele erfolgreiche Spiele, auf denen Java ausgeführt wird. Normalerweise benötigen Sie ein wenig Hilfe von nativem Code (insbesondere bei LWJGL und dergleichen), um wirklich die besten Ergebnisse zu erzielen. Aber wenn ich nur 1% meines Codes anstatt 100% portieren und neu kompilieren muss, klingt das für mich sehr viel.
Bgroenks
1
@bgroenks "100%" - Sie haben anscheinend keine Ahnung von C / C ++ ... Und wenn Sie ein Spiel erstellen, können Sie immer eine plattformübergreifende Bibliothek (SDL und eine Reihe anderer) oder ein Framework (z. B. Qt) verwenden. Zum Beispiel: EA verwendet Qt für absolut jedes Spiel, das sie haben ... Qt ist viel plattformübergreifender als Java und wird zu nativem Code kompiliert.
Lilian A. Moraru
2
Ich sehe den Punkt in Java nicht wirklich, wenn Sie Qt haben. Ich finde Qt-Code klarer, leichter zu verstehen und zu warten als Java-Code. Wenn ich meine Freunde frage, warum sie solche Angst vor C ++ haben, sagen sie mir immer, dass sie Zeiger hassen und sicherstellen, dass Speicher freigegeben wird. Es sieht so aus, als ob viele Leute nicht über shared_ptr in C ++ Bescheid wissen ... Für mich sind Qt und C # .NET / C ++ .NET am besten zu schreiben. Java-Code ist normalerweise sehr aufgebläht mit Ausnahmebehandlungen und hat normalerweise veraltete Bibliotheken (Es funktioniert meistens nur auf der Serverseite, aber der Rest ...) und häufig veraltete Dokumentation.
Lilian A. Moraru