Ist Java eine gute Wahl für plattformübergreifende Spiele? [geschlossen]

13

Ich möchte ein Spiel in Java erstellen und möchte, dass es unter Windows, Linux und Mac funktioniert. Ich bin mir ziemlich sicher, dass C # eine schlechte Wahl ist, und ich habe nicht genug Erfahrung in C oder C ++. Ich möchte mich von Flash fernhalten. Ist Java daher eine gute Wahl für mich? Meistens benutze ich C # und denke, dass Java ähnlich ist, daher gehe ich davon aus, dass es nicht so schwer zu erlernen ist. Aber ist es schnell genug? Gibt es eine Sprache, die besser zu mir passt als Java?

Kommunistischer Pfannkuchen
quelle
8
Kommt darauf an, welchen Spielstil du suchst. Je nach gewünschtem Stil könnte es sein, dass HTML5 und etwas Javascript für Sie funktionieren, wenn nicht Java.
Patrick Hughes
Oddlab verkauft Java-basierte Spiele, zB Tribal Trouble. Details zu ihrer Engine finden Sie unter oddlabs.com/technology.php
5
Minecraft ist ein großartiges Beispiel für ein plattformübergreifendes Spiel, das in Java geschrieben wurde. Wenn unser Junge seine Freunde für eine ernsthafte Minecraft-Sitzung hat, spielen sie es unter OSX, Windows und Linux.
Kev
Zwei Jahre später ist C # mit Hilfe der Unity-Engine und / oder von Monogame, die beide auch iOS, Android und WP8 unterstützen, für solche Dinge recht gut.
Magus

Antworten:

28

Java eignet sich hervorragend zum Schreiben von plattformübergreifenden Spielen. Hauptvorteile:

  • Portabilität - Im Allgemeinen können Sie ein Java-Spiel schreiben und erwarten, dass es auf den meisten Plattformen unverändert ausgeführt wird. Es ist wahrscheinlich die portabelste Option einer Sprache - C / C ++ ist die andere sehr portable Option, muss jedoch für jede Plattform neu kompiliert werden, und in vielen Fällen verfügen Bibliotheken über plattformspezifische Funktionen, die die Portabilität einschränken.
  • Leistung - Java-Code funktioniert, wenn er gut geschrieben ist, genauso gut wie jede andere Sprache, einschließlich C / C ++. Der JVM-JIT-Compiler ist extrem gut. Sie können ein hochwertiges, erfolgreiches Spiel in Java schreiben (z. B. Minecraft).
  • Bibliotheken - Es gibt eine große Auswahl an Bibliotheken für Java, die fast alle Funktionen abdecken, die Sie sich in Spielen wünschen können, von Netzwerken über Grafiken bis hin zu Sound und KI. Die meisten Java-Bibliotheken sind Open Source.

Die Hauptentscheidung, die Sie treffen müssen, ist, welches GUI-Framework Sie verwenden werden. Es gibt einige verschiedene Optionen, die bekanntesten sind jedoch:

  • jMonkeyEngine - vollwertige 3D-Engine. Wenn Sie ein 3D-Spiel erstellen möchten, ist dies wahrscheinlich die beste Wahl. Es enthält viele Game-Engine-Funktionen wie Szenendiagramme, Geländegenerierung usw.
  • LWJGL - eine Bibliothek auf niedrigerer Ebene mit direktem Zugriff auf OpenGL. Es wird Sie wahrscheinlich ansprechen, wenn Sie maximale Leistung wünschen und es Ihnen nichts ausmacht, einen Großteil Ihres Motors von Grund auf neu zu schreiben.
  • Swing - hat den Vorteil, dass es extrem portabel ist und in der Java-Laufzeit enthalten ist, sodass keine zusätzliche Abhängigkeit erforderlich ist. Es ist gut für nicht grafikintensive 2D-Spiele (Strategiespiele, Kartenspiele usw.)
  • Slick - eine 2D-Spielebibliothek basierend auf LWJGL. Wahrscheinlich gut, wenn Sie ein 2D-Spiel schreiben möchten, aber dennoch eine gute Grafikleistung benötigen (Shoot-Em-Ups, Scrolling-Plattform-Spiele usw.).
  • JavaFX - Entwickelt für Rich-Internet-Anwendungen, etwa wie Flash. Hat viele nette Funktionen, die gut für Spiele wären, obwohl ich noch nicht viel davon gesehen habe. Insbesondere JavaFX 2.0 sieht vielversprechend aus.

Die Hauptnachteile von Java für Spiele liegen in den "Randfällen", die Sie wahrscheinlich nicht betreffen, aber für einige Spielklassen relevant sind:

  • Verfügbarkeit von 3D- Engines - Die oben aufgeführten Tools und Engines sind zwar gut, entsprechen jedoch nicht ganz dem Niveau von C / C ++ - Engines wie der Unreal Engine, die von professionellen Spielefirmen verwendet wird. Daher ist Java möglicherweise nicht die erste Wahl, wenn Sie versuchen, eine große FPS mit einem Budget von mehreren Millionen Euro zu entwickeln - C / C ++ gewinnt hier immer noch.
  • GC-Latenz Java-Garbage-Collection ist insgesamt ein großer Vorteil, kann jedoch zu leichten Pausen führen, wenn GC-Zyklen auftreten. Dies wird mit neuen JVMs mit geringer Latenz deutlich besser, kann aber dennoch ein Problem für Spiele mit sehr geringen Latenzanforderungen sein (Ego-Shooter vielleicht). Eine Problemumgehung besteht darin, Bibliotheken mit geringer Latenz wie http://javolution.org/ zu verwenden . Diese scheinen jedoch eher für den Hochfrequenzhandel oder Echtzeitsysteme als für Spiele gedacht zu sein.
  • Mangelnde Fähigkeit, Optimierungen auf niedriger Ebene auszunutzen - der Java JIT-Compiler ist zwar unglaublich gut, erzwingt jedoch dennoch einige Einschränkungen, die Sie nicht vermeiden können (z. B. Begrenzungen für die Überprüfung von Arrays). Wenn Sie wirklich nativen Zugriff auf Maschinencode-Ebene benötigen, um diese Art von Dingen zu optimieren, werden Sie wahrscheinlich C / C ++ Java vorziehen.

Beachten Sie, dass Sie auch einige Bereitstellungsoptionen in Betracht ziehen müssen:

  • Applet - wird in einem Browser ausgeführt, was für Benutzer sehr praktisch ist. Aus Sicherheitsgründen sind die Möglichkeiten von Applets jedoch eher eingeschränkt. Beachten Sie, dass Sie Applets signieren können, um zusätzliche Sicherheitsberechtigungen zu erhalten. Dies führt jedoch bei den meisten Benutzern zu einer etwas beängstigenden Aufforderung.
  • Java Web Start - Besser für anspruchsvollere Spiele, die einen vollständigen lokalen Download benötigen und auch auf lokale Systemressourcen zugreifen müssen. Es funktioniert auch ziemlich plattformunabhängig. Wahrscheinlich der beste Weg für ein mittelgroßes Spiel oder etwas, das Appletsicherheitsbeschränkungen entgehen muss.
  • Download des Installationsprogramms - Sie können ein Installationsprogramm für ein Java-Spiel genauso schreiben wie für jede andere Sprache. Das Konfigurieren und Testen ist natürlich etwas aufwändiger, da Installer in der Regel über einige plattformspezifische Funktionen verfügen.
  • Web - Sie können eine HTML5-Webanwendung schreiben und die Stärke von Java ausschließlich auf der Serverseite nutzen. Erwägenswert für ein Multiplayer-Web-Spiel.

Schließlich sollten Sie auch einige der anderen JVM-Sprachen in Betracht ziehen - diese bieten alle Vorteile der oben aufgeführten Java-Plattform, aber einige betrachten sie als bessere Sprachen als Java selbst. Die bekanntesten sind Scala, Clojure und Groovy, die alle die oben aufgeführten Java-Tools und -Bibliotheken verwenden können.

mikera
quelle
1
JWS fügt nicht wirklich viel über Applets hinzu, außer Ihre App vom Browser zu trennen. In beiden Fällen sollten Sie Ihren Code signieren, wenn Sie eine OpenGL-Bibliothek verwenden.
Peter Taylor
2
Ich würde sagen, dass der lokale Systemzugriff für viele ernsthafte Spiele, insbesondere für Multiplayer-Spiele, sehr viel über Applets hinausgeht. HTML5 ist ordentlich, aber es ist immer noch ein kleines Baby mit fleckiger Unterstützung und wichtigen Elementen wie GL und Sockets, die in vielen Browsern deaktiviert sind, und das Audio ist noch nicht gut für den Spielgebrauch geeignet.
Patrick Hughes
1
@PatrickHughes, wenn Sie möchten, dass der lokale Systemzugriff über JWS ohne große, beängstigende Dialoge erfolgt, müssen Sie Ihren Code signieren. Ein signiertes Applet hat normalerweise auch lokalen Systemzugriff.
Peter Taylor
Sie können Inno Setup auch zum Verteilen Ihrer Java-Spiele verwenden.
Mahmoud Hossam
1
Sie können LIBGDX zur Liste der Pakete hinzufügen, die Sie beim Schreiben Ihrer eigenen Engine unterstützen. Es bietet Setups und JNI-Optimierungen für verschiedene Plattformen und sogar für Android und OpenGL ES.
Patrick Hughes
4

Minecraft und Blocks that Matter sind beide in Java gebaut, also ist es gut genug, um Spiele zu machen. Das Hauptproblem bei der Verwendung von Java ist die Portierung auf mobile Plattformen, wenn Sie diese Route wählen und eine native App schreiben. Android ist eine Art frankensteined Java SE mit einer separaten Bibliothek. RIMs Blackberry verwendet Java ME. iOS kann theoretisch mit Java programmiert werden, obwohl Objective-C wahrscheinlich die bessere Wahl für diese Plattform wäre.

Java ist hinreichend ähnlich zu C #. Ich finde C # -Code oft verständlich, obwohl ich nur Java kenne. Sie haben eine andere Designphilosophie, aber soweit sie mit minimalem Aufwand weitestgehend einsetzbar sind, passen beide in die Rechnung. C # ist keine schlechte Wahl für Spiele, auch wenn Ihre mobile Bereitstellung schwieriger und die Bereitstellung auf Nicht-Windows-Plattformen zeitaufwendiger oder schwieriger sein wird, je nachdem, welche spezifischen externen Bibliotheken usw. Sie verwenden.

Weltingenieur
quelle
1
Java auf dem Handy: einmal kompilieren, überall debuggen: '(.
deadalnix
0

Die naheliegendste und am wenigsten widerstandsfähige Methode ist die Verwendung der HTML5 + Javascript-Kombination. Jede Anwendung oder jedes Spiel, das mit dieser Funktion erstellt wurde, kann auf fast allen Geräten und Browsern ausgeführt werden.

Vorteil : - Sie benötigen keine Konfiguration, um Ihr Spiel auf verschiedenen Plattformen und Geräten laufen zu lassen.

HINWEIS: - Ich habe nur wenige Spiele gesehen, die mit den oben genannten Technologien erstellt wurden, aber von geringerer Statur waren. Aber ich nehme an, wenn man aus Milch Butter machen kann, ist Käse nicht unmöglich

Pankaj Upadhyay
quelle
0

Sie können Scala und Scheme Bigloo in Eclipse verwenden, um JVM für gestressten Code oder parallele Aktionen in Ihrem Java-Spiel zu verwenden.

Mit Pattern Design und UML2 können Sie auch Code mit OCL sichern, alles in Topcased.org.

Das Beherrschen dieser Werkzeuge braucht Zeit, aber sie sind der Hintergrund von Java, die Basis, die Sie an die Spitze treibt.

cl-r
quelle
-10

Kurze Antwort: nein.

Java generiert keine ausführbare Binärdatei, sondern nur Bytecode wie C # (CLI), und dies ist aus zwei Hauptgründen nicht gut für ernsthafte Geschäfte in "geöffneten Umgebungen":

  • Die Wahrscheinlichkeit, in Reverse Engineering verwickelt zu werden, ist sehr hoch, insbesondere bei alten und sehr gut bekannten Sprachen wie Java
  • Sie haben nicht die volle Kontrolle über die Maschinenleistung. Im Falle von Java spielt die JVM eine große Rolle und übernimmt die volle Kontrolle.

Natürlich hat jede Sprache ihre eigenen Bibliotheken, aber aufgrund der Vielzahl von Bibliotheken für jede Sprache ist dies kein wirkliches Problem, und ich denke nicht, dass dies der Zweck dieses Themas ist.

Vielleicht finden Sie auf professioneller Ebene etwas, das gegen die Regel verstößt, wie ein Entwickler-Kit, das alle C # -Anweisungen in Assembler-Code für eine reale Maschine übersetzt Berücksichtigen Sie für Ihre Entwicklung nur das C und das C ++, wenn Sie Ihr Produkt in einer offenen Umgebung verkaufen möchten.

Die Dinge sind ein bisschen anders für die mobilen Geräte, weil sie "geschlossene Umgebung" sind, auch wenn Android praktisch geschlossen ist, da die Quelle der realen ROMs normalerweise nicht für die Öffentlichkeit verfügbar ist % der ROMs auf aktuellen Geräten sind nicht. In diesen Fällen kann man nicht zu viel streiten, alles ist bereits für Sie eingestellt und jede Plattform hat ihre eigene Sprache, wie jeder weiß.

Wenn Sie dieses Produkt in einer offenen Umgebung verkaufen möchten, kann ich nur Sprachen vorschlagen, die kompilierten und Binär- / Assembler-Code erzeugen können. In einer geschlossenen Umgebung ist die Entscheidung aus verschiedenen Gründen normalerweise einfacher.

Mikro
quelle
7
Sie scheinen zu glauben, dass kompilierte Binärdateien schwerer zurückzuentwickeln sind als Bytecode-Binärdateien. Daran mag etwas Wahres liegen, aber nicht viel. In der Tat können wahrscheinlich mehr Leute mit x86- und x64-Disassembler arbeiten als mit CLI- oder Java-Bytecode, und Sie wären erstaunt, wie hilfreich ein Tool wie IDA Pro sein kann (Haftungsausschluss - ich habe es seit der kostenlosen Version nicht mehr verwendet) vor Jahren - jetzt ist es wahrscheinlich noch einfacher). Eine verschleierte Bytecode-Datei ist möglicherweise noch schwerer zurückzuentwickeln, und auf jeden Fall haben die meisten Menschen wenig Grund, sich darum zu kümmern.
Steve314
2
Warum wenig Grund zur Sorge? Nun, wie viele Leute schreiben ihre eigenen proprietären Spiele-Engines? Und selbst wenn Sie das tun, wie groß ist die Wahrscheinlichkeit, dass jemand Ihre Daten stiehlt (Reverse Engineering, fehlende Dokumentation usw. - viel Zeit wird dort verschwendet, egal in welcher Entwicklungssprache), anstatt sie legal zu verwenden? gut dokumentierte kostenlose Open-Source-Engine? Die Piraterie des gesamten Programms ist ein weitaus wahrscheinlicheres Problem als das Reverse Engineering, um Code-Ideen zu stehlen, und Piraten scheinen von nativ kompiliertem Code nicht im geringsten abgeschreckt zu sein.
Steve314
1
Auf Abstraktionsebenen sind JVM-Anweisungen extrem niedrig - nicht genau wie bei der Hardware, aber im Grunde genommen genauso weit von der Abstraktion auf Anwendungsebene entfernt. Wo die Anzahl der Abstraktionsebenen in den Standard-Java-Bibliotheken liegt, gibt es nur wenige Ebenen zwischen der Plattform und der endgültigen Anwendung. Abgesehen davon, dass dies normalerweise in C und C ++ der Fall ist (warum libpng usw. neu erfunden wird), verwenden die meisten Benutzer häufig verwendete Bibliotheken, die eine Reihe allgemein bekannter Plattformen bilden, und gute Reverse-Engineering-Tools können sie erkennen.
Steve314
3
Um die Anforderungen zu erfüllen, müsste der gesamte Code auf FPGA geliefert und mit Epoxidharz ummantelt werden. Überraschung, auch Black-Box-Chip-Pakete können und werden immer wieder rückentwickelt. Dann führen sogar mächtige Giganten wie Intel Fehler in ihren CPU-Paketen ein, sodass Ihre in Epoxy eingebettete Hardware-Blackbox immer noch unter der Gefährdung durch Hardware-Bibliotheken leidet. Endlich der Ruf nach Sicherheit durch Unbekanntheit, der nicht funktioniert. Reductio ad absurdum, ich weiß, aber so ist die ursprüngliche Antwort.
Patrick Hughes
3
Leider habe ich nicht den nötigen Ruf, um dich zu stimmen. Alle Ihre Argumente sind fehlgeschlagen. Es gibt Leute, die Spiele dekodieren, dekompilieren und hacken, die in C, C ++ oder einer anderen Sprache erstellt wurden, sodass ein Binärpaket nicht viel zusätzliche Sicherheit bietet. Wenn das OP diesbezüglich Bedenken hat, gibt es viele sehr gute Java-Verschleierer. Über die vollständige Kontrolle der Maschinenleistung verfügen die meisten C- und C ++ - Programmierer auch nicht über diese Funktion. Schreiben Sie einfach guten Code und der Compiler optimiert, was benötigt wird. Und selbst wenn das ein Problem ist, können Sie JNI oder JNA verwenden.
Victor Stafusa