it-swarm.dev

Warum wird Java nicht häufiger für die Spieleentwicklung verwendet?

Ich bin kein Spieleentwickler oder so, aber ich weiß, dass Java wird für die Spieleentwicklung nicht sehr häufig verwendet. Java sollte für die meisten Spiele schnell genug sein Also, wo ist der Haken? Ich kann mir einige Gründe vorstellen:

  • Mangel an Spieleentwicklern mit Java-Kenntnissen
  • Mangel an guten Rahmenbedingungen für die Spieleentwicklung
  • Programmierer wollen Java als Programmiersprache für Spiele nicht akzeptieren. Die meisten akzeptieren nur C++ als das?
  • Keine Unterstützung für Spielekonsolen (obwohl der PC-Markt noch besteht)

Es könnte natürlich etwas anderes sein. Könnte jemand, der das Geschäft besser kennt als ich, erklären, warum Java nicht in Schwung kommt, wenn es um die Entwicklung von Spielen geht?

81
Anto

Mehrere Gründe:

  • Früher brauchten Sie "direkten Zugriff" für Leistung und Benutzeroberfläche. Dies ist älter als VM Sprachen wie Java und C #).
  • Die meisten Konsolen (z. B. 360, PS3) verfügen nicht über eine JVM, sodass Sie Code aus der PC-Version nicht wiederverwenden können. Es ist viel einfacher, C++ - Code zu kompilieren, um verschiedene Geräte zu unterstützen.
  • Die meisten Mainstream-Game-Engines (z. B. Unreal) haben C++ - Bindungen. Es gibt einige Java - Konnektoren (z. B. für OpenGL), aber nichts Vergleichbares.
  • Für PC-Spiele hat DirectX nicht wirklich starke Java Unterstützung (wenn überhaupt).
  • Webbasierte Spiele laufen in JavaScript oder Flash. Sie könnten sie in Java schreiben, obwohl Sie Dinge wie GWT verwenden.
  • Auf dem iPhone wird eine Objective-C-Variante ausgeführt.

Java wird heutzutage hauptsächlich in Android Spielen) verwendet, einfach weil es die Hauptsprache für diese Plattform ist.

95
Uri

Technische Gründe:

  • Die meisten der besten 3D-Game-Engines sind in C/C++ geschrieben. Dies ist eine große Sache, da die meisten Spieleentwickler keine Kompromisse bei ihrer 3D-Engine eingehen möchten, aber auch keine von Grund auf neu schreiben möchten. Java hat jMonkeyEngine was Open Source ist und eigentlich wirklich gut aber es kann noch nicht mit dem nreal Engine .
  • In einigen sehr seltenen Situationen bietet es Vorteile, wenn "nahe am Metall" in C- oder Assemblersprache angezeigt wird, insbesondere für den Zugriff auf spezielle Hardwarefunktionen. Dies ist heutzutage nicht so wichtig, aber professionelle Spieleentwickler möchten immer noch die Option haben .....
  • Java hat einen Müll gesammelt , verwaltete Laufzeit. In 99% der Fälle ist dies ein großer Vorteil, es macht das Codieren sicherlich einfacher und weniger fehleranfällig und ist einer der Hauptgründe, warum Java so beliebt ist. Es verursacht jedoch gelegentlich Latenz Problem für Spiele als Garbage Collection-Zyklen can verursachen spürbare Pausen. Dies wird bei den neueren JVMs mit geringer Latenz immer weniger ein Problem, ist jedoch immer noch ein Problem bei grafisch intensiven Spielen, bei denen die Aufrechterhaltung hoher FPS von entscheidender Bedeutung ist.

Nichttechnische Gründe:

  • Professionelle Spieleentwicklungshäuser investieren stark in C/C++ - Fähigkeiten und -Technologien. Dies erzeugt eine große Menge an Trägheit .
  • Die weitgehend irrationale Wahrnehmung , dass Java langsam ist. Möglicherweise wahr in den 90ern, definitiv nicht wahr jetzt - Sie können sicher schreibe ein profitables, kommerzielles 3D-Spiel mit Java ( Runescape irgendjemandem? Oder wie wäre es mit Minecraft ?)
  • Eine hübsche faire Wahrnehmung , dass Java sich mehr auf Geschäftsanwendungen und das Web als auf Spiele konzentriert. Dies könnte sich mit ändern Das Wachstum von Mobile und die Notwendigkeit einer plattformübergreifenden Entwicklung sind derzeit jedoch durchaus zutreffend.

Interessanterweise gibt es auch einige gute Gründe, warum Spieleentwickler sollte Java in Betracht ziehen:

  • Portabilität - Mit zunehmender Anzahl von Zielplattformen wird Java wird immer attraktiver, da es so gut wie keine vergleichbare Fähigkeit bietet Erstellen Sie wirklich plattformübergreifende Binärdateien
  • Bibliotheksökosystem - Mit Ausnahme der 3D-Game-Engines hat Java die beste Auswahl an Bibliotheken insgesamt Plattform, Netzwerk, Sound, KI, Bildverarbeitung, Schlüssel-/Wertdatenspeicher, Sie benennen das Thema und es gibt wahrscheinlich eine Open-Source-Bibliothek Java Bibliothek dafür).
  • Serverseitige Entwicklung - Java ist eine großartige Sprache/Plattform für den Server, und da mehr Spiele massiv mehrere- Player-Elemente Die Serverseite wird immer wichtiger. Java unter Linux sieht hier als Plattform ziemlich überzeugend aus.
  • Die JVM - ist wahrscheinlich die am besten entwickelte VM Ausführungsumgebung der Welt, mit fantastischer Garbage Collection, JIT-Compiler, Parallelitätsunterstützung usw. Es wird nur noch besser, und wenn Spieleentwickler zunehmend dynamische Sprachen in ihren Spielen verwenden, wollen sie die bestmögliche Laufzeitumgebung.
  • Andere JVM-Sprachen - Java ist ein solides od Arbeitspferd, aber das echte Innovation findet mit den neuen JVM-Sprachen statt (insbesondere Scala, Clojure). Diese Sprachen bieten alle Vorteile der Java/JVM-Plattform. plus Sie sind äußerst leistungsfähige moderne Sprachen.
81
mikera

Okay, es gibt viele Fehlinformationen in diesem Thread.

Ich kenne das Spielegeschäft extrem gut, seit 25 Jahren dabei. Ich kenne Java auch in Spielen sehr gut, da ich Suns Java Game Technical Evangelist und Dozent Java Performance-Programmierer war.

In Bezug auf die Rechengeschwindigkeit schlägt Java C++ heute in vielen wissenschaftlichen Computer-Benchmarks. Sie können pathologischen Code in jeder Sprache schreiben, die schlecht funktioniert, wenn Sie möchten, aber insgesamt sind sie gleich und schon lange.

In Bezug auf die Speichernutzung hat Java einen gewissen Overhead. HelloWorld ist ein 4K-Programm in Java. Aber dieser Overhead ist in heutigen Multi-GB-Systemen ziemlich bedeutungslos. Schließlich hat Java mehr Startzeit. Ich würde nicht empfehlen, Java für Dienstprogramme mit kurzer Laufzeit wie Unix-Befehlszeilenbefehle zu verwenden. In diesen Fällen dominiert der Start Ihre Leistung. In einem Spiel ist es jedoch ziemlich unbedeutend.

Bei ordnungsgemäß geschriebenem Java Spielcode treten keine GC-Pausen auf. Genau wie C/C++ - Code erfordert es eine aktive Speicherverwaltung, jedoch nicht das Niveau von C/C++. Solange Sie Ihre Speichernutzung entweder für langlebige Objekte (die für ein ganzes Level oder ein Spiel bestehen bleiben) oder für sehr kurzlebige Objekte (Vektoren und dergleichen, die nach der Berechnung herumgereicht und schnell zerstört werden) beibehalten, sollte gc kein sichtbares Problem sein.

In Bezug auf den direkten Speicherzugriff hat Java dies schon lange; seit Java 1.4 in Form von Native Direct Byte Buffers. Ein bisschen Twiddling in Java kann aufgrund des Fehlens von vorzeichenlosen Ganzzahltypen etwas ärgerlich sein, aber die Arbeitsrunden sind alle bekannt und nicht besonders lästig.

Während seine wahre Java noch nie eine Direct3D-Bindung hatte, liegt dies daran, dass Java - Technologien nach Portabilität streben. Es verfügt über ZWEI OpenGL-Bindungen (JOGL und LWJGL) und OpenAL-Bindungen (JOAL) sowie eine tragbare Eingabebindung (JInput), die unter der Haube an DirectInput unter Windows, HID Manager unter OSX und eine Linux-Bindung (ich vergesse welche) bindet.

Es ist wahr, dass keine vollständigen Spiel-Engines Java so vorgestellt haben, wie beispielsweise Unity, C # vorgestellt hat, und das ist eine Schwäche im unabhängigen Bereich. Auf der anderen Seite gab es zwei gute APIS auf Scenegraph-Ebene, die vollständig plattformübertragbar für Windows, OSX und Linux waren. Beide wurden von Josh Slack geschrieben, der erste hieß JMonkey-Motor und der zweite Ardor3D.

Das obere Poster ist richtig, dass die beiden größten Dinge, die Java in der Spieleentwicklung zurückhielten, Vorurteile und Portabilität waren. Letzteres war das größte Problem. Obwohl Sie ein Java - Spiel schreiben und unter Windows, OSX und Linux ausliefern konnten, gab es nie eine Konsolen-VM. Dies war auf die völlige Unfähigkeit im mittleren Management von Sun zurückzuführen. Die wenigen von uns, die an Java in Spielen gearbeitet haben, hatten tatsächlich nicht weniger als dreimal Verträge mit Sony, um eine VM auf einer PlayStation zu erhalten, und alle drei Male haben das mittlere Sun-Management sie getötet.

Während Sun mit Client-Technologien flirtete, ist die Tatsache, dass das Sun-Management niemals Konsumgüter bekam. Das ist der Grund, warum Java als Client-Sprache von Sun in keiner Form erfolgreich war und warum Google und Dalvik (die Java-ähnliche VM Android) erforderlich waren, um Java überall zu einem Plattformerfolg zu machen.

Und deshalb codiere ich heute Spiele in C #. Weil Mono dorthin ging, wo sich das Sun-Management weigerte.

29
user430788

Java eignet sich hervorragend für Geschäftslogik, Server und plattformunabhängigen Code, der zuverlässig ausgeführt werden muss. Es gibt mehrere Faktoren, warum Java wird in Spielen nicht oft verwendet:

  • grenzüberprüfung und andere Sicherheitsmechanismen (geringfügiger Leistungsunterschied heutzutage)
  • konvertieren zwischen C++ - Datenstrukturen und Java Datenstrukturen (kann nicht einfach Speicher zwischen Puffern kopieren)
  • viele der Bücher und Tutorials folgen der Menge, so dass es schwierig ist, Informationen zu Nicht-C++ - Spielentwicklern zu finden
  • die Kerngrafikbibliotheken (DirectX und OpenGL) und viele Standard-Engines basieren auf C/C++
  • viele Spiele versuchen, so schnell wie möglich zu laufen, damit sie optisch ansprechendere Funktionen hinzufügen können

Es ist nicht einfach, mit C++ - Bibliotheken aus Bytecode-Sprachen wie Java (Schreiben einer JNI-Schicht) und .net (viele Marshalling-/Unmarshalling-, API-/Strukturattribute) zu arbeiten ein bisschen Arbeit für wenig Nutzen.

Eine Randnotiz: Einige Spieleserver verwenden Java.

Ähnlicher Beitrag hier : https://stackoverflow.com/questions/1034458/why-arent-video-games-written-in- Java

9
Graeme Wicksted

Java ist für die meisten Spieleentwicklungen nicht schnell genug. Es ist weitaus langsamer als die Verwendung von C++/Assembly, was der Standard ist. Es ist der gleiche Grund, warum mehr Spieleentwicklung nicht mit C # oder VB durchgeführt wird. Spieleentwickler benötigen und planen jeden letzten Taktzyklus, den sie für Dinge wie Physikberechnungen, KI-Logik und Umgebungsinteraktionen in die Hände bekommen können.

Für einfachere Spiele könnte Java sehr effektiv verwendet werden. Wenn Sie einen Tetris-Klon oder Bejeweled oder etwas anderes mit dieser Detailstufe erstellen möchten, funktioniert Java einwandfrei. Aber Java kann unmöglich Spiele wie Halo, Ehrenmedaille, Command & Conquer usw. erstellen und spielbar machen. Zumindest so wie es heutzutage existiert.

Und die Gründe, die Sie in Ihrer Frage auflisten, sind ebenfalls gültig. Außer, denke ich, wegen des Mangels an Spieleentwicklern mit Java Fachwissen. Viele Spiele auf Handys und anderen tragbaren Geräten sind in Java geschrieben (einschließlich der meisten Android Spiele), und einige der Spiele sind ziemlich gut. Ich denke, es gibt eine anständige und wachsende Basis von Spieleentwicklern mit Java Wissen.

Der Gedanke ändert sich in Bezug auf die Fähigkeit, diese höheren Sprachen für einige der fortgeschritteneren Spiele zu verwenden. Zum Beispiel ist eines meiner Lieblingsspiele, Aurans Zugsimulator, mit großen Teilen in C # geschrieben und funktioniert recht gut. Die Basis wächst also und wird sich weiterentwickeln.

5
BBlake

Bei modernen Spielen dreht sich alles um 3D-Grafiken, die in Spezialhardware ausgeführt werden.

Bereits im Jahr 2002 stellte Jacob Marner in seinem Bericht "Evaluating Java for Game Development") fest, dass Java für Spiele durchaus verwendbar war, mit Ausnahme der leistungsabhängigsten Teile, und aufgrund der Robustheit der Sprache und der zugrunde liegenden JVM war es billiger, dies auf diese Weise zu tun.

http://Java.coe.psu.ac.th/FreeOnline/Evaluating%20Java%20for%20Game%20Development.pdf

Ich persönlich bin der Meinung, dass dieser Nachteil angesichts der Fortschritte, die seitdem insbesondere bei 3D-Grafiken erzielt wurden, und der hervorragenden Bindung an OpenGL et al. Heutzutage viel weniger ausgeprägt ist.

Daher muss das Problem woanders liegen. Ein wahrscheinlicher Grund ist die Größe der Laufzeit Java Laufzeit (was heutzutage bei Multi-DVD-Spielen viel weniger ein Problem darstellt) und ein anderer die Trägheit des vorhandenen Codes. Es ist notorisch spröde, mit der Arbeit zu beginnen Ein dritter Grund ist, mit was die Star-Entwickler, die die Spiele machen, vertraut sind. Ein vierter Grund ist, ob Java überhaupt auf der Plattform verfügbar ist.

Eines ist jedoch sicher: Die meisten Spiele werden jetzt skriptfähig, anstatt alles von Anfang an in C-Code zu brennen, und Sie möchten die beste Laufzeit unter Ihrer Skriptsprache. Heutzutage bedeutet dies im Wesentlichen entweder die CLR oder die JVM.

5
user1249

Spieleentwickler sind gerne nah am Metall und schreiben oft ihre engen inneren Schleifen in Assembly. Java bietet nicht die gleiche mögliche Leistung, sowohl in Bezug auf die konsistente Geschwindigkeit als auch auf die Speichernutzung (das Ausführen einer JIT fordert ihren Tribut).

4
dan_waterworth

Ich denke, der limitierende Faktor für die meisten Leute ist die (fehlende) Verfügbarkeit guter Spiel-Engines. Um sehr weit zu kommen, müssen wir uns ansehen, warum diese nicht verfügbar sind.

Ich würde das für einen Moment aus der anderen Richtung betrachten. Die Entwicklung einer Spiel-Engine (zum Beispiel) ist ein viel Arbeit. Wer würde genug von der Entwicklung eines solchen profitieren, um Zeit und Mühe dafür zu investieren?

Die meisten offensichtlichen Kandidaten für eine Framework-ähnliche Entwicklung in/for Java (z. B. IBM, Oracle) scheinen kein Interesse an Spielen zu haben. Die offensichtlichen Kandidaten für die Spieleentwicklung (z. B. Id, EA) ) scheinen fast ebenso wenig Interesse an Java zu haben.

Fast der nur Kandidat, den ich mir vorstellen kann, scheint überhaupt vernünftig zu sein, wäre Google. Die primäre Entwicklungssprache für Android ist Java), und die Förderung der Spieleentwicklung für Android könnte bietet einen echten Vorteil für die Plattform.

Soweit ich weiß, haben sie dies (noch?) Nicht getan, was fast allen anderen ziemlich strenge Grenzen lässt. Ohne die modernen, leistungsstarken Spiele-Engines, die die Entwicklung auf Java) bedeuten, bedeutet dies einiges an zusätzlicher Arbeit, mit (wie es für mich aussieht) wenig Aussicht, viel zu produzieren Nutzen Sie diese zusätzliche Arbeit.

4
Jerry Coffin

Die Frage ist gleichbedeutend mit folgenden Fragen:

Was ist besser, um Ihr Auto, einen Bootsmotor oder ein Düsentriebwerk anzutreiben?.

Es kommt auf Skalierbarkeit, Fehlervermeidung, Geschwindigkeit, Speichersignatur, Modularität und eine ganze Reihe von Dingen an. Die Frage sollte nicht sein, was als Industriestandard besser ist, sondern "Was ist besser für mich", was Sie wissen oder wie gut Sie es wissen. Wenn es den Job macht, dann macht es den Job, wenn Sie die Idee tatsächlich verkaufen können, dann funktioniert es und wer weiß, dass Sie vielleicht sogar ein paar Löffel biegen.

1
Meh

Java wurde nicht für die Spieleentwicklung entwickelt, Java wurde als Sprache "für das Web" entwickelt.

In Bezug auf die Spieleentwicklung unterstützte Sun Java als Spieleentwicklungssprache, da Microsoft C # unterstützte) nicht wirklich.

Ich denke, das Fehlen überzeugender Frameworks für die Spieleentwicklung hat das wirklich getötet Java in diesem Aspekt.

0
Mahmoud Hossam