Java est-il un bon choix pour les jeux multiplateformes? [fermé]


13

Je cherche à créer un jeu en Java et j'aimerais qu'il fonctionne sur Windows, Linux et Mac. Je suis presque sûr que C # est un mauvais choix pour cela, et je n'ai pas assez d'expérience en C ou C ++. Je veux rester loin de Flash. Par conséquent, Java est-il un bon choix pour moi? Surtout, j'utilise C #, et je pense que Java est similaire, donc je suppose que ce ne sera pas si difficile à apprendre. Mais est-ce assez rapide? Existe-t-il un langage mieux adapté à mes besoins que Java?


8
Cela dépend du style de jeu que vous cherchez à faire. Selon le style souhaité, il se pourrait que HTML5 et certains javascript fonctionnent pour vous, sinon java.
Patrick Hughes

Oddlab vend des jeux basés sur Java, par exemple Tribal Trouble. Vous pouvez voir les détails de leur moteur sur oddlabs.com/technology.php

5
Minecraft est un excellent exemple de jeu multiplateforme écrit en Java. Lorsque notre garçon a ses amis pour une session Minecraft sérieuse, ils le jouent sur OSX, Windows et Linux.
Kev

Deux ans plus tard, C # est maintenant assez bon pour de telles choses avec l'aide du moteur Unity et / ou Monogame, qui prennent également en charge iOS, Android et WP8.
Magus

Réponses:


28

Java est extrêmement adapté à l'écriture de jeux multi-plateformes. Principaux avantages:

  • Portabilité - En général, vous pouvez écrire un jeu Java et vous attendre à ce qu'il s'exécute sans changement sur la plupart des plates-formes. C'est probablement l'option la plus portable de tous les langages - C / C ++ est l'autre option hautement portable mais doit être recompilée pour chaque plate-forme et dans de nombreux cas, les bibliothèques ont des fonctionnalités spécifiques à la plate-forme qui limitent la portabilité.
  • Performances - Le code Java, s'il est bien écrit, fonctionnera à peu près aussi bien que tout autre langage, y compris C / C ++. Le compilateur JVM JIT est extrêmement bon. Vous pouvez écrire un jeu réussi de haute qualité en Java (Minecraft, par exemple).
  • Bibliothèques - il existe une vaste gamme de bibliothèques disponibles pour Java qui couvrent presque toutes les fonctionnalités que vous pourriez souhaiter dans les jeux, de la mise en réseau aux graphiques, au son et à l'IA. La plupart des bibliothèques Java sont open source.

La principale décision que vous devrez prendre est le cadre GUI que vous allez utiliser. Il existe plusieurs options, mais les plus importantes sont:

  • jMonkeyEngine - moteur 3D à part entière. Si vous souhaitez créer un jeu en 3D, c'est probablement votre meilleur choix - contient de nombreuses fonctionnalités du moteur de jeu telles que des graphiques de scène, la génération de terrain, etc.
  • LWJGL - une bibliothèque de bas niveau avec un accès direct à OpenGL. Susceptible de vous intéresser si vous voulez des performances maximales et que cela ne vous dérange pas d'écrire beaucoup de votre moteur à partir de zéro.
  • Swing - a l'avantage d'être extrêmement portable et est inclus dans le runtime Java, il n'a donc pas besoin de dépendance supplémentaire. C'est bon pour les jeux 2D non graphiques intensifs (jeux de stratégie, jeux de cartes, etc.)
  • Slick - une bibliothèque de jeux 2D basée sur LWJGL. Probablement bien si vous voulez écrire un jeu 2D mais avez toujours besoin de bonnes performances graphiques (shoot-em-ups, jeux de plateforme à défilement, etc.)
  • JavaFX - conçu pour les applications Internet riches, à peu près comme Flash. A beaucoup de fonctionnalités intéressantes qui seraient bonnes pour les jeux, même si je ne les ai pas encore beaucoup utilisées. JavaFX 2.0 en particulier semble assez prometteur.

Les principaux inconvénients de Java pour les jeux se situent vraiment autour des «cas marginaux» qui ne vous affecteront probablement pas, mais sont pertinents pour certaines classes de jeu:

  • Disponibilité du moteur 3D - bien que les outils et moteurs répertoriés ci-dessus soient bons, ils ne sont toujours pas au niveau des moteurs C / C ++ comme le moteur Unreal utilisé par les sociétés de jeux professionnelles. Donc, Java ne sera peut-être pas votre premier choix si vous essayez de développer un FPS majeur avec un budget de plusieurs millions - C / C ++ gagne toujours ici.
  • La latence GC de la récupération de place Java est globalement un énorme avantage, mais elle peut provoquer de légères pauses lorsque les cycles GC se produisent. Cela s'améliore beaucoup avec les nouvelles machines virtuelles Java à faible latence, mais cela peut toujours être un problème pour les jeux avec des exigences de latence très faibles (tireurs à la première personne peut-être). Une solution de contournement consiste à utiliser des bibliothèques à faible latence comme http://javolution.org/ , mais celles-ci semblent être davantage ciblées sur les systèmes de trading à haute fréquence ou en temps réel plutôt que sur les jeux.
  • Manque de capacité à exploiter les optimisations de bas niveau - alors que le compilateur Java JIT est incroyablement bon, il applique toujours certaines contraintes que vous ne pouvez pas éviter (vérification des limites sur les tableaux, par exemple). Si vous avez vraiment besoin d'obtenir un accès natif au niveau du code machine pour optimiser ce genre de chose, vous préférerez probablement C / C ++ à Java.

Notez qu'il existe également quelques options de déploiement à considérer:

  • Applet - s'exécute dans un navigateur, très pratique pour les utilisateurs, mais les applets sont plutôt limitées dans ce qu'elles peuvent faire pour des raisons de sécurité. Notez que vous pouvez signer des applets pour obtenir des privilèges de sécurité supplémentaires, bien que cela provoque une invite légèrement effrayante pour la plupart des utilisateurs.
  • Java Web Start - mieux pour les jeux plus sophistiqués qui nécessitent un téléchargement local complet et doivent également accéder aux ressources du système local. Cela fonctionne également d'une manière assez indépendante de la plateforme. Probablement le meilleur itinéraire pour un jeu de taille moyenne ou quelque chose qui doit échapper aux restrictions de sécurité des applets.
  • Téléchargement de l'installateur - Vous pouvez écrire un installateur pour un jeu Java comme vous le feriez pour n'importe quelle autre langue. Bien sûr, c'est un peu plus de travail à configurer et à tester, car les installateurs ont généralement des fonctionnalités spécifiques à la plate-forme.
  • Web - vous pouvez écrire une application Web HTML5 et utiliser la force de Java uniquement du côté serveur. Il vaut la peine d'envisager un jeu Web multijoueur.

Enfin, il convient également de considérer certains des autres langages JVM - ceux-ci ont tous les avantages de la plate-forme Java répertoriée ci-dessus, mais certains les considèrent comme de meilleurs langages que Java lui-même. Scala, Clojure et Groovy seraient les plus importants, et ils peuvent tous utiliser les outils et bibliothèques Java répertoriés ci-dessus.


1
JWS n'ajoute pas grand-chose aux applets autres que la séparation de votre application du navigateur. Dans les deux cas, je pense que vous voudrez signer votre code si vous utilisez une bibliothèque OpenGL.
Peter Taylor

2
Je dirais que l'accès au système local est un très gros "beaucoup" sur les restrictions d'applet pour de nombreux jeux sérieux, en particulier multijoueur. HTML5 est soigné, mais c'est toujours un petit bébé avec un support inégal et des bits importants comme GL et Sockets désactivés sur de nombreux navigateurs, et l'audio n'est pas encore bien adapté à l'utilisation du jeu.
Patrick Hughes

1
@PatrickHughes, si vous voulez que l'accès au système local à partir de JWS sans grandes boîtes de dialogue effrayantes, vous devrez signer votre code - et une applet signée aura généralement accès au système local aussi.
Peter Taylor

Vous pouvez également utiliser Inno Setup pour distribuer vos jeux Java.
Mahmoud Hossam

1
Vous pouvez ajouter LIBGDX à la liste des packages qui vous aident à écrire votre propre moteur; il a des configurations et des optimisations JNI pour diverses plates-formes et même Android et jusqu'à OpenGL ES.
Patrick Hughes

4

Minecraft et Blocks that Matter sont tous deux construits en Java, donc oui, c'est très bien pour créer des jeux. Le principal problème que vous rencontrerez lors de l'utilisation de Java est le portage sur des plates-formes mobiles si vous choisissez de suivre cette voie et d'écrire une application native. Android est une sorte de Java SE frankensteined avec une bibliothèque séparée. Le Blackberry de RIM utilise Java ME. iOS peut en théorie être programmé avec Java, mais Objective-C serait probablement un meilleur choix pour cette plate-forme.

Java est assez similaire à C #. Je trouve souvent le code C # compréhensible même si je ne connais que Java. Ils ont une philosophie de conception différente, mais dans la mesure où ils sont largement déployables avec un minimum de tracas, ils conviennent tous les deux. C # n'est pas un choix terrible pour les jeux, même si votre déploiement mobile sera plus difficile et le déploiement sur des plates-formes non Windows prendra plus de temps ou sera difficile en fonction des bibliothèques externes spécifiques et ainsi de suite que vous finirez par utiliser.


1
Java sur mobile: compiler une fois, déboguer partout: '(.
deadalnix

0

La manière la plus évidente et la moins résistante est d'utiliser le combo HTML5 + javascript. Toute application ou jeu créé à l'aide de ce logiciel s'exécutera sur presque tous les appareils et navigateurs.

Avantage : - Vous n'aurez besoin d'aucune configuration pour faire fonctionner votre jeu sur différentes plates-formes et appareils.

REMARQUE: - J'ai vu peu de jeux qui sont construits en utilisant les technologies susmentionnées, mais ils étaient de plus petite taille. Mais je suppose que si l'on peut faire du beurre avec du lait, le fromage n'est pas impossible


0

Vous pouvez utiliser Scala et Scheme Bigloo sur Eclipse pour utiliser JVM pour du code stressé ou une action parallèle dans votre jeu Java.

Avec Pattern Design et UML2, vous pouvez également sécuriser du code avec OCL, tout est dans Topcased.org.

La maîtrise de ces outils prend du temps, mais ce sont les antécédents de Java, la base qui vous poussera au sommet.


-10

Réponse courte: non.

Java ne génère pas d'exécutable binaire mais uniquement du bytecode comme le fait C # (CLI), et ce n'est pas une bonne chose pour les affaires sérieuses dans des "environnements ouverts" pour deux raisons principales:

  • la probabilité de se retrouver piégé dans l'ingénierie inverse est très élevée, en particulier avec les langages anciens et très bien connus comme Java
  • vous n'êtes pas en contrôle total des performances de la machine, dans le cas de Java, la JVM joue un grand rôle en prenant le contrôle total.

Bien sûr, chaque langue a ses propres bibliothèques, mais en raison de leur grande quantité pour chaque langue, ce n'est pas un vrai problème et je ne pense pas que ce soit le but de ce sujet.

Peut-être qu'à un niveau professionnel, vous pouvez trouver quelque chose qui peut enfreindre la règle comme un kit de développement qui peut traduire toutes les instructions C # en code d'assemblage pour une machine du monde réel, mais si ce type d'approche n'est pas dans les cartes, vous êtes pratiquement obligé de ne considérez que le C et le C ++ pour votre développement lorsque vous souhaitez vendre votre produit dans un environnement ouvert.

Les choses sont un peu différentes pour les appareils mobiles car ils sont un "environnement fermé", même Android est pratiquement fermé étant donné que la source des ROM réelles n'est généralement pas accessible au public, Android peut être considéré comme un logiciel open source, mais le 99 Le% des ROM sur les appareils réels ne le sont pas. Dans ce cas, vous ne pouvez pas trop discuter, tout est déjà réglé pour vous et chaque plate-forme a son propre langage comme tout le monde le sait.

En fin de compte, si vous allez vendre ces produits dans des environnements ouverts, je ne peux que suggérer des langages capables de produire du code compilé et binaire / d'assemblage, dans des environnements fermés, la décision est généralement plus facile à faire pour différentes raisons.


7
Vous semblez croire que les binaires compilés sont plus difficiles à rétroconcevoir que les binaires de bytecode. Il peut y avoir un peu de vérité là-dedans, mais pas beaucoup. En fait, probablement plus de gens peuvent travailler avec le désassembleur x86 et x64 qu'avec CLI ou Java bytecode, et vous seriez étonné de voir à quel point un outil comme IDA Pro peut être utile (avertissement - je ne l'ai pas utilisé depuis la version gratuite un bon nombre il y a quelques années - c'est probablement encore plus facile maintenant). Un fichier de bytecode obscurci peut même être plus difficile à rétroconcevoir et, dans tous les cas, la plupart des gens auront peu de raisons de s'en soucier.
Steve314

2
Pourquoi peu de raisons de s'en soucier? Eh bien, combien de personnes écrivent leurs propres moteurs de jeu propriétaires de bas niveau? Et même si vous faites cela, quelles sont les chances que quelqu'un préfère voler le vôtre (nécessitant une ingénierie inverse, manquant de tout type de documentation, etc. - beaucoup de temps perdu là, quel que soit le langage de développement) plutôt que d'utiliser légalement un moteur open source gratuit bien documenté? Le piratage du programme complet est une préoccupation bien plus probable que l'ingénierie inverse pour voler des idées de code, et les pirates ne semblent pas du tout découragés par le code natif compilé.
Steve314

1
Sur les niveaux d'abstraction, les instructions JVM sont d'un niveau extrêmement bas - pas exactement comme dans le matériel, mais fondamentalement aussi éloignées de l'abstraction de la couche application. Lorsque les couches de comptage d'abstraction se trouvent dans les bibliothèques Java standard, ce qui signifie qu'il y a vraiment peu de couches entre la plate-forme et l'application finale. Sauf que cela se produit normalement en C et C ++ de toute façon (pourquoi réinventer libpng, etc.) - la plupart des gens utiliseront des bibliothèques communes qui forment efficacement un ensemble de plates-formes largement connues, et de bons outils de rétro-ingénierie peuvent les reconnaître.
Steve314

3
Pour satisfaire aux exigences, tout le code devrait être expédié sur FPGA et enfermé dans de l'époxy. Surprise, même les paquets de puces à boîte noire peuvent et sont toujours rétro-conçus. Ensuite, même des géants puissants comme Intel introduisent des bogues dans leurs packages de processeur, de sorte que votre boîte noire matérielle intégrée à l'époxy va toujours souffrir de l'exposition aux bibliothèques matérielles. Enfin l'appel à la sécurité par l'obscurité, ça ne marche pas. Reductio ad absurdum, je sais, mais la réponse originale l'est aussi.
Patrick Hughes

3
Malheureusement, je n'ai pas assez de réputation pour vous dévaloriser. Tous vos arguments ont échoué. Il y a des gens qui décodent, décompilent et piratent les jeux produits en C, C ++ ou dans n'importe quel langage, donc être un paquet binaire ne fournira pas beaucoup de sécurité supplémentaire. De plus, si le PO s'inquiète à ce sujet, il existe de très bons masqueurs Java. À propos du contrôle total des performances de la machine, la plupart des programmeurs C et C ++ ne l'ont pas non plus, il suffit d'écrire du bon code et le compilateur optimisera ce qui est nécessaire. Et même si c'est un problème, vous pouvez utiliser JNI ou JNA.
Victor Stafusa
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.