Java est-il viable pour le développement de jeux sérieux? [fermé]

64

J'ai parcouru Internet, mais il n'y a pas beaucoup de ressources pour le développement de jeux Java, pas aussi nombreuses que C ++. En fait, la plupart des moteurs sont écrits en C ++. J'ai essayé de jouer à un jeu fait avec jMonkeyEngine, mais le jeu était terriblement lent, au point que mon ordinateur s'est figé. Je n'avais aucune autre application Java en cours d'exécution, et rien de trop gourmand en ressources. En revanche, mon ordinateur peut jouer facilement aux jeux 3D les plus modernes. Si je continue à apprendre et à améliorer Java maintenant, et qu'il s'avère plus tard que je dois apprendre le C ++, il peut être difficile de passer à l'actif.

Java est-il un langage acceptable pour le développement de jeux sérieux? Par sérieux, j'entends des graphiques de haute qualité, sans grand retard sur les ordinateurs modernes. Je veux aussi envisager de créer des jeux pour consoles.

tehtros
la source
25
Minecraft n'est-il pas construit avec Java? Ou principalement OpenGL? Oh, et jetez un œil à C # si vous n’êtes pas à 100% sur Java, c’est génial.
Aralox
7
Pourquoi ne venez-vous pas à la discussion Stack Overflow C ++? Nous aimons le C ++, nous pensons qu'il peut absolument être utilisé correctement, nous savons le faire et nous serions ravis de le partager.
DeadMG
12
Minecraft s'appuie sur les compétences de java + LWJGL + Notch en matière de codage. Il est donc terrible en termes de performances.
MLProgrammer-CiM
3
Qu'il s'agisse de vos jeux de codage ou de tout autre chose, vous enfermer dans une seule langue ne vous aidera pas à l'avenir. Déconnectez-vous un peu, du C ++ ou de quelque chose comme Python. Cela prend du temps, mais cela fait de vous un meilleur dev.
loganfsmyth
4
Vous allez recevoir beaucoup de désinformation parce que les guerres Java / C ++ brûlent vivement, soyez prêt à demander des exemples spécifiques avant d'accepter un avis et à faire des recherches plus approfondies par vous-même =) Cela étant dit, je suis d'accord avec @loganfsmyth que vous aurez besoin de connaître plusieurs langues, car ce n'est qu'alors que vous pourrez choisir le bon outil pour chaque tâche. Dans l'immédiat, si vous voulez juste apprendre la "programmation par style de jeu", utilisez ce que vous maîtrisez (Java), puis apprenez le C ++ plus tard. Heck, plus tard, vous pouvez faire des pipelines de contenu en C # et des jeux en Java ME, difficile à prédire =)
Patrick Hughes

Réponses:

54

Oui, vérifiez cette liste pour une preuve. Ce sont des jeux créés avec Java en utilisant la bibliothèque de jeux Lightweight Java (LWJGL). Il s’agit d’un framework de bas niveau fournissant OpenGL pour des graphiques de haute qualité et OpenAL pour les sons. Il fournit également une API d'entrée. Avec ceux-ci, vous pouvez très facilement vous lancer dans le développement de jeux sérieux en Java.

J'écris actuellement mon deuxième jeu 3D en tant que projet de passe-temps en Java et je l'adore. Dans le passé, j’écrivais mes jeux en C ++, mais après le passage à Java, il n’ya plus de retour en arrière. Prendre en charge plusieurs systèmes d'exploitation avec Java peut s'avérer très simple. Par exemple, mon précédent jeu Java, que j'avais développé sous Windows pendant un an, fonctionnait immédiatement sous Linux et sous OS X avec un seul bug sans qu'il soit nécessaire de compiler quoi que ce soit sur ces plates-formes.

D'autre part, avec Java, vous avez quelques problèmes.

  1. Éboueur. Comme d'autres l'ont dit, la gestion de la mémoire non déterministe est un problème et vous devez le coder à l'esprit.
  2. Manque de bibliothèques tierces. La plupart des bibliothèques disponibles ne supportent pas Java. D'autre part, vous avez toujours la possibilité d'appeler ces bibliothèques natives à partir de Java également, mais cela demande plus de travail. Il existe également des ports Java ou des wrappers prêts à l'emploi disponibles pour les bibliothèques populaires, par exemple, j'utilise JBullet - le portage Java de Bullet Physics Library . D'autre part, Java possède une énorme bibliothèque de classes intégrée, ce qui réduit le besoin de bibliothèques tierces non liées au jeu. Le manque de bibliothèques ne m'a pas posé de problème, mais j'imagine que cela peut l'être pour d'autres.
  3. Java n'est pas supporté par les consoles de jeux populaires et il n'y a pas de commutateur facile à ceux de Java pour autant que je sache. D'autre part, Android, qui est une plate-forme mobile populaire, utilise une forme de Java. C’est également une option, mais n’excluez pas le même code Java pour qu’il fonctionne à la fois sur un PC et sur un appareil Android.
  4. Petite communauté. La plupart des programmeurs de jeux utilisent le C ++ et, selon mon expérience, n'apprécient pas souvent Java. Ne vous attendez pas à recevoir autant d'aide des autres. Ne vous attendez pas à trouver un emploi dans le développement de jeux sans compétences en C ++.
msell
la source
40

Pas vraiment. Voici la chose - premièrement, il y a très peu de bibliothèques existantes pour Java comparées à la quasi - totalité du C ++.

Deuxièmement, Java en tant que langage ne se prête tout simplement pas bien au développement de jeux. Je veux dire, par exemple, si vous traitez avec des tampons GPU, Java ne fournit pas de fonctionnalité de langage qui vous aidera à vous assurer qu'ils sont correctement verrouillés. débloqué ou éliminé, ce que C ++ fait. De plus, il y a le problème de performances et le GC n'est pas déterministe, ce qui est très mauvais pour un match.

Je n'ai jamais observé de jeu non indépendant ayant passé beaucoup de temps dans une langue qui n'avait pas été compilée en code natif avant l'exécution, et même les jeux indépendants qui le font sont une rareté. Donc, ma conviction actuelle est que cela ne peut tout simplement pas être fait.

De plus, si je continue à apprendre et à améliorer Java maintenant, et qu'il s'avère que plus tard, je devrais apprendre le C ++, est-il difficile de faire la transition?

Oui, absolument. Java et C ++ sont très différents, malgré leurs similitudes syntaxiques superficielles. L’expérience Java ne compte pratiquement pour rien lors de l’apprentissage du C ++.

Le gameplay au lieu de graphismes est un choix viable, et vous pouvez le voir dans le succès de jeux comme Terarria et Minecraft. Mais si vous avez l'intention de créer des graphiques srs, cela ne sera pas réalisable en Java.

DeadMG
la source
6
+1 puisqu'il a spécifié des graphiques lourds, un jeu rapide sans décalage.
Joshua Drake
1
L'absence de types de données non signés en Java s'y oppose également. Oui, vous pouvez contourner ce problème, mais ce n'est pas idéal et vous utiliserez un code qui ne reflète pas vraiment les données sous-jacentes correctement.
Maximus Minimus
@deadmg Les cas de verrouillage et de déverrouillage font-ils référence à certaines fonctionnalités de l'API DirectX? & Pouvez-vous me dire qu’il est si mauvais d’avoir un GC non déterministe?
Quazi Irfan,
Un GC non déterministe peut équivaloir à une perte d'images, si vous arrêtez mal la pause du monde et si les choses restent bloquées plus longtemps que nécessaire pour restituer l'image. En pratique, cela n'arrive pas souvent / jamais si vous planifiez votre utilisation de la mémoire, les collecteurs de JVM peuvent être configurés pour une pause faible (bien dans les limites de sécurité pour la suppression d'images). Pourtant, ce n’est pas une chose amusante à gérer. Vous finissez par devoir restituer une partie importante de la productivité que vous aviez obtenue en quittant C ++.
Michael
2
Un début, vous devrez totalement ré-écrire.
DeadMG
25

Je suis donc vraiment sérieux dans le développement de jeux. Java est-il toujours un choix viable? J'ai essayé plusieurs fois d'apprendre le C ++, mais je n'aime pas vraiment le langage. Je ne sais pas vraiment pourquoi, mais d'habitude, chaque fois que j'essaie d'apprendre, je ne peux jamais saisir les sujets.

Si votre raison de choisir Java est que vous ne compreniez pas le C ++, vos programmes Java ne seront pas assez rapides pour des graphismes de haute qualité. Utiliser un langage de niveau supérieur devrait être parce que cela vous rend plus productif, et non pas parce que vous ne pouvez pas comprendre le langage de niveau inférieur.

Je ne pense pas que ce soit une très mauvaise idée d’écrire un jeu en Java, en particulier si le jeu est simple, mais vous allez immédiatement rencontrer des problèmes de performances en Java si vous l’utilisez comme béquille.

En bref, pouvons-nous prendre au sérieux Java, pour le développement de jeux sérieux. Cela inclut des graphismes lourds, un jeu rapide sans décalage et, éventuellement, un basculement facile vers les consoles?

  1. Graphiques lourds: possible, mais vous allez faire la même chose en Java / LWJGL et en C ++ / GL: écrire des octets dans les tampons GPU et / ou utiliser les listes d'affichage obsolètes comme le fait Minecraft. Si vous ne comprenez pas la gestion de la mémoire, vous ne le ferez pas correctement non plus.

  2. Jeu rapide sans décalage: Ce n'est pas une tâche facile dans n'importe quelle langue et vous risquez plutôt de vous tirer dans le pied sans y penser.

  3. Non, Java ne sera pas disponible sur les consoles.

Jimmy
la source
En guise de question de côté, qu'est-ce qui a remplacé les listes d'affichage lorsqu'elles étaient obsolètes?
Suds
@Suds: pipeline programmable, je crois.
DeadMG
Ha! déjà couvert. VBO: gamedev.stackexchange.com/questions/22170/…
Jimmy
Les plateformes mobiles pourraient être considérées comme des consoles. Je me rends compte qu'il parlait probablement des trois grands, mais Android utilise Java et de nombreux jeux sont créés pour cela.
Amplify91
1
@ Amplify91 oui, quelques jeux sont écrits en Java pour Android. Mais la plupart des bons jeux et probablement tous les jeux graphiques intensifs ou multi-plateformes sont écrits en C ++ en utilisant le NDK Android.
Coyote
15

Un programmeur expérimenté connaît généralement de nombreux langages de programmation - apprendre des langages de programmation supplémentaires n’est pas une tâche ardue une fois que vous maîtrisez bien un de ces langages. Cependant, je recommanderais fortement que C ++ ne soit pas votre première langue, et probablement pas la seconde non plus.

En effet, C ++ tire beaucoup de son efficacité de ne pas effectuer de vérification d'erreur d'exécution importante. Par exemple, l'accès à un élément à la fin d'un tableau en Java lève toujours une exception indiquant au programmeur exactement ce qui ne va pas. En C ++, vous aurez peut-être de la chance et cela plantera immédiatement, mais très souvent, d' autres données seront effacées et l'erreur ne s'affichera que bien plus tard .

Je vous suggérerais de vous en tenir à Java pour le moment (ou de passer en C # si vous préférez cela). Cela vous permettra de faire les choses plus rapidement que d'utiliser C ++, et les performances sur PC ne devraient pas être un problème.

Pensez à apprendre le C ++ après avoir terminé quelques projets dans des langues plus sûres. C ++ est ce dont vous aurez besoin pour la plupart des travaux de développement de jeux professionnels.

Notez que, à l'exception de C # / XNA, obtenir au minimum un jeu écrit sur une console nécessite au minimum la création d'une société disposant d'un bureau et disposant d'un budget important pour le matériel de développement et autres dépenses.

Adam
la source
Ceci est également exceptionnellement vrai, car d'autres langages que C ++ vous donneront un sentiment d'accomplissement. C ++ peut prendre des centaines d’heures pour ce qui peut sembler ne rien être. Apprendre d’autres langues d’abord vous permet de vous mouiller les pieds.
Darkenor
Vos commentaires sur le traitement des erreurs de traitement concernent en réalité C (et le code dit C ++ qui est vraiment C). C ++ a des bibliothèques standard (et des bibliothèques de modèles standard) qui gèrent beaucoup mieux la gestion des erreurs que ce que vous décrivez. C ++ possède également des bibliothèques fournies par le fournisseur (telles que MFC) qui permettent un traitement correct des erreurs.
Jasper
9

Avertissement: Cela ne répond pas exactement à votre question. Cependant, j'ai tenté de (brièvement) mentionner quelques points qui pourraient vous intéresser.

La raison pour laquelle vous voyez tant de choses sur le C ++ est que le C ++ est toujours le standard de l'industrie - le langage le plus courant pour les consoles, etc.

Java n'est pas fréquemment utilisé. Minecraft est un jeu très populaire qui a fait la différence avec Java. mais ce n'est pas génial graphiquement. Spiral Knights n'est pas mauvais - également en Java, avec des graphiques significatifs.

Si vous aimez Java, la syntaxe de C # est très similaire, avec l'avantage de pouvoir interagir avec C ++. Vous pouvez donc effectuer des opérations de bas niveau en C ++ si nécessaire. Unity peut utiliser C # pour les scripts et XNA est un excellent choix.

Encore une fois, Java n'est pas largement utilisé. Si vous aimez le style et la syntaxe, je pense que vous constaterez que C # est une expérience de codage très similaire et très agréable.

J'espère que vos rêves le feront, c'est très amusant en cours de route :)

cendres999
la source
8
Beaucoup d'inexactitudes dans ces articles. Les "mauvais" graphiques de Minecraft ne sont pas (fortement) liés à la langue. Les mauvaises performances de MC sont directement liées au fait que Java est un mauvais langage pour les jeux en raison de problèmes de performances énormes et que LWJGL est une bibliothèque inappropriée pour les grands projets de codage pour la même raison. Mais le facteur le plus important était le mauvais codage et la mauvaise mise en œuvre de Notch, qui est en train d'être corrigée ... lentement. C # vous donne toutes les capacités de la mémoire gérée sans la plupart des problèmes de performances Java. L'inconvénient est que C # est fortement centré sur Microsoft pour les jeux et les applications.
MLProgrammer-CiM
2
@EfEs: Je n'aime pas vous en parler, mais la mémoire gérée est terrible pour les jeux, et les personnes qui codent des jeux dans XNA doivent passer plus de temps à la gestion de la mémoire que celles qui codent en C ++. La nature non déterministe de la GC signifie que vous devez tout mettre en commun et éviter une allocation comme la peste - et non la manière dont la langue était censée être utilisée.
DeadMG
Cette réponse n'était pas censée être exacte à 100%; Je n'ai cité que des exemples que je connais vaguement. N'hésitez pas à DV.
ashes999
2
@DeadMG Je sais que le C ++ est la voie à suivre. J'essayais simplement d'expliquer que C # est meilleur que Java pour les jeux.
MLProgrammer-CiM
5
Étant un développeur C # de longue date (et non un développeur de jeu, pensait-il), j'estime que la mise en commun et la gestion de la mémoire sont d'excellents problèmes pour tout système mal conçu. Les personnes qui ont l’esprit C / C ++ et les méthodes de développement que je connais ne peuvent que difficilement haleter dans les modèles de mémoire gérée, de conception et d’architecture qui doivent être utilisés et en tirer parti dans un langage tel que Java / C #. Ce que j'essaie de dire, ce n'est pas que les techniques ou les produits C / C ++ soient mauvais, mais que même si vous utilisez des langages plus simples en termes de syntaxe (comme Java et C #), vous avez encore besoin de beaucoup d'expérience pour concevoir votre jeu comme il convient. façon.
Ivaylo Slavov
3

Cela ne répond pas à votre question. les problèmes graphiques et de console semblent être quelque chose que vous devez absolument prendre en compte. De plus, le GC affecte les performances. Mais ce que j'écris à propos de:

Si vous écrivez des programmes OO volumineux et complexes, vous les écrivez 5 fois plus rapidement en Java qu'en C ++. En outre, la maintenance sera beaucoup plus facile. J'ai changé (bien sûr pour les logiciels non destinés au jeu) et ma productivité a grimpé en flèche. C #, une autre bonne alternative, est plus difficile à apprendre que Java car il en existe beaucoup plus. Quand vous le savez, vous pouvez écrire du code même plus rapidement qu'en Java. il vous offre beaucoup de trucs. Cependant, je trouve que ces astuces peuvent rendre la maintenance difficile. Et puis il y a la documentation Java, qui aide avec les bibliothèques Sun et votre propre ancien code. C # n'a rien de tel.

J'ai fait un grand jeu poilu en Java et trouvé la langue parfaite, mais mes graphismes étaient élémentaires et ce n'était pas un jeu de tir où un dixième de seconde était une éternité pour les joueurs. De plus, je pense en ajouter beaucoup plus tard, alors que je pense que la plupart des gens vont simplement écrire un tout nouveau jeu.

RalphChapin
la source
3

Regardez mec, la réponse simple à "Est-ce que Java est viable pour les développeurs de jeu" est un oui évident. Vous pouvez utiliser n'importe quel langage de programmation pour créer des jeux. Cela ne signifie pas que vous devriez .

C ++ (gestion de la mémoire de bas niveau, absence de garbage collector, attention aux pointeurs, structure sous forme de tableaux, etc.) est probablement ce que vous devez apprendre si vous souhaitez exploiter les ressources d'un ordinateur de manière plus efficace . Vos jeux fonctionneront mieux si vous exploitez les ressources de l'ordinateur le plus efficacement possible.

Java effectue certaines tâches (telles que la vérification des limites du tableau) qui ralentissent son exécution. Dans cet exemple de code optimisé de bruit Java Perlin, l'auteur a commenté "(l'accès au tableau est beaucoup plus lent que l'accès aux membres)". Ce genre de chose est plutôt contre-intuitif issu d'un arrière-plan C ++. Mais à Java, de telles choses sont.

Je dis d'arrêter d'esquiver la balle, d'apprendre le C ++ et de l'utiliser.

bobobobo
la source
1

Vous devriez le faire dans la langue que vous connaissez le mieux jusqu'à ce que vous puissiez vous permettre une éducation formelle (baccalauréat en sciences?) En informatique, en mettant l'accent sur la conception de jeux. Vous pouvez éventuellement utiliser votre jeu pour obtenir une bourse, surtout si vous pouvez dire "je l'ai fait sans aucune formation formelle en Java"

Les machines virtuelles modernes, même celle d'Oracle, offrent de nombreuses fonctionnalités pour répondre aux préoccupations exprimées par les utilisateurs. Vous pouvez utiliser différents récupérateurs de mémoire pour obtenir un comportement plus déterministe du récupérateur de mémoire. Je n'ai pas beaucoup d'expérience avec les bibliothèques 3D - seulement un peu avec Java3D - mais personne ici ne semble s'en être plaint. L'analyse d'évasion permet maintenant l'élimination des verrous et une allocation beaucoup plus rapide / négligeable d'objets de très courte durée.

Le problème est que, que vous choisissiez Java ou C ++, vous devrez apprendre à utiliser correctement la simultanéité et bien comprendre la gestion de la mémoire. Après tout, vous pouvez tout aussi facilement mallocvous tromper new. Je ne sais pas à quoi ressemblent les outils pour C ++, mais les outils de profilage pour Java sont assez faciles à utiliser, gratuits et intégrés à l'EDI. Vous pouvez les utiliser pour localiser des problèmes de performances et apprendre .

Ornithorynque mutant
la source
5
L'éducation formelle en CS vaut la peine de chier pour des compétences de programmation réelles dans n'importe quelle discipline. Je le saurais, je suis en troisième année.
DeadMG
4
Pas du tout d'accord avec DeadMG. Après avoir obtenu mon diplôme et choisi des cours qui me plaisent, CS a porté de 10% à 100% mes capacités de développement de jeux. Cela ne m'a pas appris l'interface utilisateur, l'iconographie, etc., mais le codage réel et réel.
cendres999
2
@ ashes999: Alors vous avez eu de la chance. Mon parcours ne vaut rien et je sais qu'il y en a beaucoup d'autres qui ressentent la même chose.
DeadMG
2
@DeadMG, c'est difficile de voir quand on étudie. Vous verrez une fois que vous aurez travaillé pendant quelques années et appris d’autres compétences complémentaires. J'ai fait. Mais peut-être que j’ai juste fait beaucoup d’attention et essayé d’appliquer tout à mon passe-temps de développeur de jeu.
ashes999
1
Je dirais que cela dépend de l'école et du professeur. J'ai eu quelques bonnes classes de programmation où j'ai appris une tonne; et j’en ai eu quelques-uns où j’ai eu le sentiment d’avoir perdu connaissance en assistant à ces cours. C'est tout pour avoir un bon professeur ou non. OMI.
Nate