Ist Java für die Entwicklung ernsthafter Spiele geeignet? [geschlossen]

64

Ich habe das Internet durchsucht, aber es gibt nicht sehr viele Ressourcen für die Entwicklung von Java-Spielen, bei weitem nicht so viele wie in C ++. Tatsächlich sind die meisten Engines in C ++ geschrieben. Ich habe versucht, ein mit jMonkeyEngine erstelltes Spiel zu spielen, aber das Spiel war so langsam, dass mein Computer abstürzte. Ich hatte keine anderen Java-Anwendungen und nichts zu ressourcenintensiv. Im Gegensatz dazu kann mein Computer die meisten modernen 3D-Spiele mühelos spielen. Wenn ich jetzt weiterhin Java lerne und verbessere und es sich herausstellt, dass ich später C ++ lernen muss, kann es schwierig sein, den Wechsel vorzunehmen.

Ist Java eine akzeptable Sprache für die Entwicklung von Serious Games? Mit ernst meine ich qualitativ hochwertige Grafiken, ohne viel Verzögerung auf modernen Computern. Ich möchte auch überlegen, Spiele für Konsolen zu entwickeln.

tehtros
quelle
25
Ist Minecraft nicht mit Java gebaut? Oder hauptsächlich OpenGL? Oh und probiere C # aus, wenn du nicht zu 100% auf Java eingestellt bist, da es fantastisch ist.
Aralox
7
Warum kommst du nicht zum Stack Overflow C ++ Chat? Wir lieben C ++, wir glauben, dass es absolut richtig eingesetzt werden kann, und wir wissen, wie man das macht, und wir würden uns sehr freuen, es zu teilen.
DeadMG
12
Minecraft ist Java + LWJGL + Notchs Programmierkenntnisse, also ist es in Bezug auf die Leistung SCHRECKLICH.
MLProgrammer-CiM
3
Egal, ob Sie Ihre Codierungsspiele oder etwas anderes spielen, es wird Ihnen in Zukunft nicht mehr helfen, sich auf eine einzige Sprache festzulegen. Verzweigen Sie etwas, entweder C ++ oder etwas anderes wie Python. Es braucht Zeit, aber es macht dich zu einem besseren Entwickler.
Loganfsmyth
4
Sie werden eine Menge Fehlinformationen bekommen, weil die Java / C ++ - Kriege hell brennen. Seien Sie bereit, nach konkreten Beispielen zu fragen, bevor Sie eine Meinung annehmen, und auch mehr auf eigene Faust zu recherchieren Sie müssen viele Sprachen beherrschen, denn nur dann können Sie für jede Aufgabe das richtige Werkzeug auswählen. Wenn Sie in naher Zukunft nur "Game Style Programming" erlernen möchten, verwenden Sie das, mit dem Sie vertraut sind (Java) und lernen Sie später C ++. Heck, später machen Sie vielleicht Content-Pipelines in C # und Spiele in Java ME, schwer vorherzusagen =)
Patrick Hughes

Antworten:

54

Ja, überprüfen Sie diese Liste auf einen Beweis. Dies sind einige Spiele, die mit Java unter Verwendung der Lightweight Java Game Library (LWJGL) erstellt wurden. Es ist ein Low-Level-Framework, das OpenGL für hochwertige Grafiken und OpenAL für Sounds bereitstellt. Es bietet auch Eingabe-API. Mit diesen können Sie ganz einfach mit der Entwicklung ernsthafter Spiele in Java beginnen.

Ich schreibe gerade mein zweites 3D-Spiel als Hobbyprojekt in Java und ich liebe es einfach. Früher habe ich meine Spiele mit C ++ geschrieben, aber nach dem Umstieg auf Java gibt es kein Zurück mehr. Die Unterstützung mehrerer Betriebssysteme mit Java kann sehr einfach sein. Mein früheres Java-Spiel, das ich ein Jahr lang unter Windows entwickelt habe, lief sofort unter Linux und unter OS X mit nur einem Fehler, ohne dass irgendetwas auf diesen Plattformen kompiliert werden muss.

Auf der anderen Seite haben Sie mit Java einige Probleme.

  1. Müllsammler. Wie bereits erwähnt, ist die nicht deterministische Speicherverwaltung ein Problem, das Sie unbedingt codieren müssen.
  2. Fehlende Bibliotheken von Drittanbietern. Die meisten verfügbaren Bibliotheken unterstützen Java nicht. Auf der anderen Seite haben Sie immer die Möglichkeit, diese nativen Bibliotheken auch von Java aus aufzurufen, aber es ist mehr Arbeit, dies zu tun. Es gibt auch Java-Ports oder fertige Wrapper für gängige Bibliotheken, zum Beispiel verwende ich JBullet - Java-Port der Bullet Physics Library . Auf der anderen Seite ist in Java eine riesige Klassenbibliothek integriert, die den Bedarf an Bibliotheken von Drittanbietern verringert, die nicht mit dem Spiel zusammenhängen. Der Mangel an Bibliotheken war für mich kein Problem, aber ich kann mir vorstellen, dass es für andere sein kann.
  3. Java wird von populären Spielekonsolen nicht unterstützt und es gibt meines Wissens keinen einfachen Wechsel zu Java. Auf der anderen Seite verwendet Android, eine beliebte mobile Plattform, eine Form von Java. Dies ist auch eine Option, aber abgesehen von demselben Java-Code, der sowohl auf einem PC als auch auf einem Android-Gerät funktioniert.
  4. Kleinere Community. Die meisten Spieleprogrammierer verwenden C ++ und meiner Erfahrung nach mögen sie Java oft nicht. Erwarten Sie nicht so viel Hilfe von anderen. Erwarten Sie nicht, einen Job in der Spieleentwicklung ohne C ++ - Kenntnisse zu bekommen.
msell
quelle
40

Nicht wirklich. Hier ist das Wichtigste: Erstens gibt es in Bezug auf die vorhandenen Bibliotheken für Java im Vergleich zu praktisch allem , was für C ++ erforderlich ist, nur sehr wenig .

Zweitens eignet sich Java als Sprache einfach nicht gut für die Spieleentwicklung. Ich meine, wenn Sie sich beispielsweise mit GPU-Puffern befassen, bietet Java keine Sprachfunktion, mit der Sie sicherstellen können, dass sie korrekt gesperrt sind und entsperrt oder entsorgt, was C ++ tut. Außerdem gibt es ein Leistungsproblem - und der GC ist nicht deterministisch, was für ein Spiel sehr schlecht ist.

Ich habe noch nie ein Nicht-Indie-Spiel gesehen, das vor der Ausführung viel Zeit in einer Sprache verbracht hat, die nicht mit nativem Code kompiliert wurde, und selbst die Indie-Spiele, die dies tun, sind eine Seltenheit. Deshalb glaube ich im Moment, dass dies einfach nicht möglich ist.

Wenn ich jetzt weiterhin Java lerne und verbessere und es sich herausstellt, dass ich später C ++ lernen muss, wird der Wechsel schwierig?

Ja, absolut wird es. Java und C ++ unterscheiden sich trotz ihrer oberflächlichen syntaktischen Ähnlichkeiten erheblich . Java-Erfahrung ist beim Erlernen von C ++ so gut wie nichts.

Gameplay über Grafik ist eine gute Wahl, und Sie können es am Erfolg von Spielen wie Terarria und Minecraft sehen. Wenn Sie jedoch srs-Grafiken erstellen möchten, ist dies in Java nicht möglich.

DeadMG
quelle
6
+1, da er schwere Grafik, schnelles Spiel ohne Verzögerung angegeben.
Joshua Drake
1
Das Fehlen von unsignierten Datentypen in Java spricht ebenfalls dagegen. Ja, Sie können es umgehen, aber es ist nicht ideal und Sie verwenden Code, der die zugrunde liegenden Daten nicht richtig widerspiegelt.
Maximus Minimus
@deadmg Handelt es sich um einen gesperrten oder entsperrten Fall , beziehen Sie sich auf einige DirectX-API-Funktionen? & Kannst du mir sagen, was so schlimm an einer nicht deterministischen GC ist?
Quazi Irfan
Nicht-deterministisches GC kann mit dem Löschen von Frames gleichgesetzt werden, wenn Sie einen schlechten Stopp erhalten und die Welt pausiert und die Dinge länger blockiert, als für das Rendern des Frames erforderlich ist. In der Praxis passiert dies nicht oft / nie, wenn Sie die Speichernutzung planen. Die Kollektoren von JVM können für eine niedrige Pause konfiguriert werden (innerhalb sicherer Grenzen für das Löschen von Frames). Trotzdem macht es keinen Spaß, sich damit auseinandersetzen zu müssen. Am Ende müssen Sie erhebliche Beträge der Produktivität zurückgeben, die Sie beim Verlassen von C ++ erzielt haben.
Michael
2
Ein Anfang, den Sie völlig neu schreiben müssen.
DeadMG
25

Ich meine es wirklich ernst mit der Spieleentwicklung. Ist Java immer noch eine gute Wahl? Ich habe mehrfach versucht, C ++ zu lernen, aber ich mag die Sprache nicht wirklich. Ich weiß nicht genau warum, aber normalerweise kann ich die Themen nie erfassen, wenn ich versuche zu lernen.

Wenn Sie sich für Java entschieden haben, weil Sie C ++ nicht verstehen konnten, sind Ihre Java-Programme für hochwertige Grafiken nicht schnell genug. Eine höhere Sprache sollte verwendet werden, um produktiver zu sein, und nicht, um die niedrigere Sprache zu verstehen.

Ich halte es nicht für eine ganz schlechte Idee, ein Spiel in Java zu schreiben, besonders wenn das Spiel einfach ist, aber Sie werden sofort auf Leistungsprobleme in Java stoßen, wenn Sie es als Krücke verwenden.

Kurz gesagt, kann Java ernst genommen werden, um ernsthafte Spiele zu entwickeln. Dazu gehören schwere Grafiken, schnelles Spielen ohne Verzögerung und möglicherweise ein einfacher Wechsel zu Konsolen?

  1. Schwere Grafiken: Möglich, aber Sie werden in Java / LWJGL das Gleiche tun wie in C ++ / GL: Schreiben von Bytes in GPU-Puffer und / oder Verwenden der veralteten Anzeigelisten wie in Minecraft. Wenn Sie die Speicherverwaltung nicht verstehen, werden Sie dies auch nicht richtig tun.

  2. Schnelles Spiel ohne Verzögerung: Keine leichte Aufgabe in jeder Sprache, und es ist wahrscheinlicher, dass Sie sich in beide Richtungen in den Fuß schießen, ohne darüber nachzudenken.

  3. Nein, Java wird auf Konsolen nicht verfügbar sein.

Jimmy
quelle
Was hat als Nebenfrage die Anzeigelisten ersetzt, als sie veraltet waren?
Suds
@Suds: Programmierbare Pipeline, glaube ich.
DeadMG
Ha! schon abgedeckt. VBOs: gamedev.stackexchange.com/questions/22170/...
Jimmy
Mobile Plattformen können als Konsolen betrachtet werden. Mir ist klar, dass er wahrscheinlich über die großen Drei gesprochen hat, aber Android verwendet Java und es sind viele Spiele dafür entwickelt worden.
Amplify91
1
@ Amplify91 ja ein paar spiele sind in java für android geschrieben. Aber die meisten guten Spiele und wahrscheinlich alle grafikintensiven oder plattformübergreifenden Spiele sind in C ++ mit dem Android NDK geschrieben.
Coyote
15

Ein erfahrener Programmierer kennt in der Regel viele Programmiersprachen - das Erlernen zusätzlicher Programmiersprachen ist nicht allzu schwierig, wenn Sie eine Programmiersprache gut kennen. Ich würde jedoch nachdrücklich empfehlen, dass C ++ nicht Ihre erste Sprache ist und wahrscheinlich auch nicht die zweite.

Dies liegt daran, dass C ++ einen großen Teil seiner Effizienz dadurch erzielt, dass es keine signifikanten Laufzeitfehler überprüft. Wenn Sie beispielsweise in Java auf ein Element am Ende eines Arrays zugreifen, wird immer eine Ausnahme ausgelöst, die dem Programmierer genau mitteilt, was nicht stimmt. In C ++ haben Sie möglicherweise Glück und es stürzt sofort ab, aber sehr häufig werden einige andere Daten unbemerkt gelöscht und der Fehler wird erst viel später angezeigt .

Ich würde vorschlagen, dass Sie vorerst bei Java bleiben (oder zu C # wechseln, wenn Sie das bevorzugen). Auf diese Weise können Sie Dinge schneller erledigen als mit C ++, und die Leistung auf einem PC sollte kein Problem darstellen.

Denken Sie daran, C ++ zu lernen, nachdem Sie einige Projekte in sichereren Sprachen abgeschlossen haben. C ++ ist das, was Sie für die meisten professionellen Spieleentwicklungsjobs benötigen.

Mit Ausnahme von C # / XNA müssen Sie für ein Spiel, das Sie mindestens auf eine Konsole geschrieben haben, eine Firma mit einem Büro einrichten und über ein großes Budget für Entwicklungshardware und andere Ausgaben verfügen.

Adam
quelle
Dies gilt auch in Ausnahmefällen, da Ihnen andere Sprachen als C ++ ein Gefühl der Leistung vermitteln. C ++ kann Hunderte von Stunden dauern, bis sich nichts anfühlt. Wenn Sie zuerst andere Sprachen lernen, werden Ihre Füße nass.
Darkenor
Bei Ihren Kommentaren zur Fehlerbehebung geht es wirklich um C (und den sogenannten C ++ - Code, der wirklich C ist). C ++ verfügt über Standardbibliotheken (und Standardvorlagenbibliotheken), die eine viel bessere Fehlerbehandlung aufweisen als die von Ihnen beschriebenen. C ++ verfügt auch über vom Hersteller bereitgestellte Bibliotheken (z. B. MFC), die eine angemessene Fehlerbehandlung ermöglichen.
Jasper
9

Haftungsausschluss: Dies beantwortet Ihre Frage nicht genau. Ich habe jedoch versucht, einige Punkte (kurz) zu erwähnen, die für Sie von Interesse sein könnten.

Der Grund, warum Sie so viel über C ++ sehen, ist, dass C ++ immer noch der Industriestandard ist - die häufigste Sprache für Konsolen usw.

Java wird nicht häufig verwendet. Minecraft ist ein ziemlich beliebtes Spiel, das es mit Java zu etwas ganz Besonderem gemacht hat. Aber grafisch ist es nicht so toll. Spiral Knights ist nicht schlecht - auch in Java gemacht, mit bedeutenden Grafiken.

Wenn Sie Java mögen, ist C # in der Syntax sehr ähnlich, mit dem Vorteil, dass es mit C ++ interoperieren kann - so dass bei Bedarf einfache Dinge in C ++ erledigt werden können. Unity kann C # für die Skripterstellung verwenden, und XNA ist eine ausgezeichnete Wahl.

Auch hier ist Java nicht weit verbreitet. Wenn Sie den Stil und die Syntax mögen, werden Sie feststellen, dass C # ein sehr ähnliches, sehr angenehmes Programmiererlebnis ist.

Ich hoffe deine Träume machen es, es macht eine Menge Spaß auf dem Weg :)

ashes999
quelle
8
Viele, viele Ungenauigkeiten in diesen Beiträgen. Minecraft "schlechte" Grafiken sind nicht (stark) sprachbezogen. Die schlechte Leistung von MC hängt direkt damit zusammen, dass Java eine schlechte Sprache für Spiele ist, weil es große Leistungsprobleme gibt, und LWJGL ist aus dem gleichen Grund eine ungeeignete Bibliothek für große Codierungsprojekte. Der größte Faktor war jedoch die schlechte Codierung und Implementierung von Notch, die langsam behoben wird. Mit C # können Sie den gesamten verwalteten Speicher ohne die meisten Java-Leistungsprobleme nutzen. Der Nachteil ist, dass C # sowohl für Spiele als auch für Anwendungen stark auf Microsoft ausgerichtet ist.
MLProgrammer-CiM
2
@EfEs: Ich hasse es, es Ihnen vorzustellen, aber verwalteter Speicher ist für Spiele schrecklich , und Leute, die Spiele in XNA codieren, müssen mehr Zeit für die Speicherverwaltung aufwenden als Leute, die in C ++ codieren. Der nicht deterministische Charakter des GC bedeutet, dass Sie praktisch alles bündeln und eine Zuordnung wie die Pest vermeiden müssen - nicht die Art und Weise, wie die Sprache verwendet werden sollte.
DeadMG
Diese Antwort sollte nicht 100% genau sein. Ich habe nur Beispiele angeführt, die ich vage kenne. Fühlen Sie sich frei zu DV.
Asche999
2
@DeadMG Ich weiß, dass C ++ der richtige Weg ist. Ich habe nur versucht zu erklären, dass C # für Spiele besser ist als Java.
MLProgrammer-CiM
5
Als langjähriger C # -Entwickler (dachte nicht an Spieleentwickler) sind Pooling und Speicherverwaltung meiner Meinung nach große Probleme für jedes schlecht gestaltete System. Menschen mit der mir bekannten C / C ++ - Denkweise und -Entwicklungsweise greifen kaum auf die verwalteten Speicher-, Design- und Architekturmuster zurück, die verwendet werden müssen, und nutzen sie in einer Sprache wie Java / C #. Was ich damit sagen will, ist nicht, dass C / C ++ - Techniken oder -Produkte schlecht sind, sondern dass Sie auch dann viel Erfahrung benötigen, wenn Sie in Bezug auf die Syntax einfachere Sprachen (wie Java und C #) verwenden, um Ihr Spiel richtig zu gestalten Weg.
Ivaylo Slavov
3

Dies beantwortet Ihre Frage nicht. Die Grafik- und Konsolenprobleme scheinen etwas zu sein, das Sie unbedingt berücksichtigen müssen. Auch GC wirkt sich auf die Leistung aus. Aber worüber schreibe ich:

Wenn Sie große, komplexe OO-Programme schreiben, schreiben Sie sie in Java fünfmal schneller als in C ++. Außerdem wird die Wartung erheblich vereinfacht. Ich wechselte (zugegebenermaßen für Nicht-Spiel-Software) und meine Produktivität stieg sprunghaft an. C #, eine andere gute Alternative, ist schwieriger zu erlernen als Java, da es viel mehr davon gibt. Wenn Sie es wissen, können Sie Code sogar schneller als in Java schreiben. Es bietet Ihnen eine Menge Tricks. Ich finde jedoch, dass diese Tricks die Wartung erschweren können. Und dann gibt es noch ein Java-Dokument, das bei den Sun-Bibliotheken und Ihrem eigenen alten Code hilft . C # hat nichts Vergleichbares.

Ich habe in Java ein haariges Spiel gemacht und fand die Sprache perfekt, aber meine Grafiken waren einfach und es war kein Shooter, bei dem eine Zehntelsekunde für die Spieler eine Ewigkeit war. Ich gehe davon aus, dass ich später noch viel hinzufügen werde, während ich denke, dass die meisten Leute einfach ein brandneues Spiel schreiben.

RalphChapin
quelle
3

Guck mal, die einfache Antwort auf "Ist Java für Spieleentwickler brauchbar ?" Ist ein klares Ja. Sie können eine beliebige Programmiersprache verwenden, um Spiele zu erstellen. Das heißt nicht, dass Sie sollten .

Wahrscheinlich sollten Sie genau die Dinge lernen , die Sie von C ++ abhalten (Speicherverwaltung auf niedriger Ebene, kein Garbage Collector, auf Zeiger, Strukturen als Arrays usw. achten müssen) , wenn Sie die Ressourcen eines Computers am effizientesten nutzen möchten . Ihre Spiele funktionieren am besten, wenn Sie die Ressourcen des Computers am effizientesten nutzen.

Java führt einige Dinge aus (z. B. die Überprüfung der Array-Grenzen), die die Ausführung nur verlangsamen. In diesem optimierten Java Perlin-Beispielcode für Rauschen kommentierte der Autor "(der Array-Zugriff ist viel langsamer als der Mitgliederzugriff)". Diese Art von Dingen ist ziemlich kontraintuitiv, da sie aus einem C ++ - Hintergrund stammen. Aber in Java sind solche Dinge.

Ich sage, hör auf, der Kugel auszuweichen, lerne C ++ und benutze es.

Bobobobo
quelle
1

Sie sollten es in der Sprache tun, die Sie am besten können, bis Sie sich eine formale Ausbildung (Bachelor of Science?) In Informatik leisten können, wobei der Schwerpunkt auf dem Spieledesign liegt. Sie könnten möglicherweise Ihr Spiel verwenden, um ein Stipendium zu erhalten, insbesondere wenn Sie sagen können: "Ich habe dies ohne eine formale Ausbildung in Java getan."

Moderne JVMs, auch die von Oracle, haben viele, viele Funktionen, um die Bedenken zu berücksichtigen, die die Leute hier angesprochen haben. Sie können verschiedene Garbage Collectors verwenden, um ein deterministischeres Garbage Collector-Verhalten zu erzielen. Ich habe keine umfangreichen Erfahrungen mit den 3D-Bibliotheken - nur ein wenig mit Java3D -, aber niemand hier scheint sich darüber beschwert zu haben. Die Escape-Analyse ermöglicht jetzt die Aufhebung von Sperren und eine viel schnellere / vernachlässigbare Zuordnung von Objekten mit sehr kurzer Lebensdauer.

Das Problem ist, ob Sie sich für Java von C ++ entscheiden, Sie müssen lernen, wie man Parallelität richtig verwendet und ein gutes Verständnis der Speicherverwaltung besitzt. Immerhin können Sie genauso leicht mit vermasseln, mallocwie Sie mit können new. Ich weiß nicht, wie die Tools für C ++ aussehen, aber die Profilerstellungstools für Java sind recht einfach zu verwenden, kostenlos und in die IDE integriert. Sie können sie verwenden, um Leistungsprobleme aufzuspüren und zu lernen .

Mutant Platypus
quelle
5
Die formale Ausbildung in CS ist für die tatsächlichen Programmierkenntnisse in jeder Disziplin eine Scheiße wert. Ich würde wissen, ich bin in meinem dritten Jahr.
DeadMG
4
Bestimmt nicht mit DeadMG einverstanden. Nach Abschluss und Auswahl von Kursen, die ich mag, hat CS meine Fähigkeiten zur Spieleentwicklung von 10% auf 100% gesteigert. Es brachte mir nicht die Benutzeroberfläche, die Ikonografie usw. bei, sondern die tatsächliche, echte Codierung.
ashes999
2
@ ashes999: Dann hast du Glück gehabt. Mein Kurs ist wertlos und ich weiß, dass es viele andere gibt, denen es genauso geht.
DeadMG
2
@DeadMG Es ist schwer zu sehen, wenn Sie studieren. Sobald Sie ein paar Jahre F / T gearbeitet haben und andere ergänzende Fähigkeiten erlernt haben, werden Sie sehen. Ich tat. Aber vielleicht habe ich einfach viel Aufmerksamkeit geschenkt und versucht, alles auf mein Spielentwickler-Hobby anzuwenden.
Asche999
1
Ich würde sagen, dass es von der Schule und dem Professor abhängt. Ich hatte ein paar großartige Programmierkurse, in denen ich eine Menge gelernt habe. und ich hatte einige, bei denen ich tatsächlich das Gefühl hatte, durch den Besuch mein Wissen verloren zu haben. Es kommt nur darauf an, einen guten Professor zu haben oder nicht. IMO.
Nate