web-dev-qa-db-fra.com

Moteurs de jeux Java

Je me suis intéressé récemment au développement de jeux et mon premier langage de programmation est Java. Après avoir joué à de nombreux jeux magnifiques développés en c ++, je me suis demandé pourquoi Java n’était pas très utilisé dans l’industrie du jeu vidéo. J'ai examiné jMonkeyEngine 3 et quelques autres environnements de moteur de jeu, mais les captures d'écran que j'ai vues sont beaucoup moins époustouflantes. Des titres tels que Need for Speed ​​Hot, EA et Assassins Creed d’Ubisoft témoignent d’un tel réalisme. Pourquoi Java ne peut-il pas produire de tels jeux de force? Est-ce l'œuvre d'art? 

Java et C # ont un garbage collection automatique et c ++ pas. Le programmeur doit faire plus attention à l’utilisation de la mémoire pour éviter les pointeurs qui pendent, etc. 

Merci les gars.

17
Binaryrespawn

Java et C # ont des ordures automatiques collection et c ++ pas. Le le programmeur doit faire plus attention à l'utilisation de la mémoire pour éviter la pendaison pointeurs et ainsi de suite.

Vous avez vous-même répondu à votre question.

Dans les jeux, programmer la récupération de place n’est pas un avantage. Même si les performances de Java sont à peu près équivalentes à celles du C++ pour la plupart des tâches, le JIT peut même procéder à des optimisations très agressives qui surpassent celles qui peuvent être effectuées lors de l'analyse statique; le ramassage des ordures peut faire tomber les filtres au plus mauvais moment.

En outre, pour les tâches graphiques intensives, Java n’est pas très approprié, car de nombreux éléments considérés comme dangereux par le moteur d’exécution sont par conséquent interdits (comme le transfert de pointeurs pour réinterpréter les données).

Une autre question importante est le savoir-faire déjà acquis dans le secteur. L'inertie du C++ dans l'industrie du jeu vidéo est énorme. Tous les développeurs de jeux connaissent aujourd'hui le C et le C++. Avoir un grand bassin de développeurs à embaucher réduit l'un des risques de gestion qui sont les personnes clés qui quittent l'entreprise.

Malgré cela, il y a eu des jeux réussis avec des parties écrites en Java, comme Vampire: The Masquerade - Redemption .

Un jeu plus récent tel que Minecraft est entièrement écrit en Java; mais il ne comporte pas de graphiques de pointe, l'accent étant mis davantage sur la nature dynamique de l'environnement virtuel.

Et de nombreux autres jeux et moteurs ont une exécution prenant en charge un langage de script géré (allocation et récupération de mémoire automatiques sécurisées) construit sur une plate-forme de rendu et de réseau hautes performances (écrite en C/C++), tel que Unreal Engine for Exemple.

20
fortran

En règle générale, tout ce qui est dit ici était une raison pour ne pas utiliser Java pour le développement de jeux; était. L’industrie du jeu connaît actuellement un changement de paradigme. Trois choses ont changé ou sont en train de changer l'industrie du jeu vidéo:

  • Le piratage
  • Modèles de programme client-serveur
  • Modèles de programme de mise en réseau modulaire

Un jeu n'est plus entièrement dépendant de lui-même. Les principaux avantages qui existaient dans les premiers (langages de bas niveau) sont en train de ralentir et sont atténués par les avantages qui existent au sein de langages tels que C # et Java (langages de haut niveau). Deux exemples bruts, mais indéniables, sont les jeux fonctionnant sur Facebook, et médias distants tels que téléphones, tablettes, etc.

Il est important d'indiquer que, dans les deux scénarios, les trois problèmes énumérés ci-dessus sont dissous. Un jeu qui ne peut pas fonctionner sans serveur n'a pas à craindre de contrefaçon (hébergement privé par reverse engineering non inclus). La demande de jeux dépendant du réseau nécessite un langage capable d’équilibrer performances système et performances réseau (généralement un stalemate entre Java et C/C++, favorisant C/C++ strictement en raison bibliothèques existantes). Cependant, un jeu conçu dans un module de programme de réseau modulaire ne serait pas pratique à développer dans des langages de bas niveau tels que C/C++. Une entreprise intéressée par la conception d'un jeu en C/C++ pour un modèle de programme de réseau modulaire devrait créer une machine virtuelle entièrement dédiée à ce jeu ou reprogrammer/recompiler le jeu un certain nombre de fois, au point de devenir fou. OMI, s'il est peut-être trop tôt pour dire quelle langue sera la préférée, je parie sur Java pour trois raisons principales. 

  • 1) La machine virtuelle Java permet aux applications basées sur Java de fonctionner virtuellement sur n’importe quelle plate-forme , Qu’elles soient dérivées de Apple, Android, Windows 8 ou Linux/UNIX (pratiquement compatibles avec toutes les plates-formes matérielles).

  • 2) Java utilise OpenJL (le dérivé OpenGL, qui s’exécutera sur OpenGL en tant que client - jMonkey est un moteur conçu dans OpenJL). Il est important de noter que seul Microsoft Windows utilise DirectX, aussi bon soit-il. Il se peut qu’il n’ait qu’un seul inconvénient. Pratiquement tous les systèmes d’exploitation pouvant exécuter des jeux seront capables de restituer en OpenGL et en conception modulaire, comme jamais auparavant. (Veuillez noter que Microsoft tente de résoudre ce problème en monopolisant la distribution de Windows 8).

  • 3) Java prend en charge l’unité interne de threads au sein de la machine virtuelle, ce qui lui permet de tirer pleinement parti des processeurs multicœurs sans l’utilisation de De bibliothèques tierces. Actuellement, ceci est un handicap pour toutes les autres langues (En particulier celles développées pour les téléphones).

Bien que la machine virtuelle Java pose un problème de temps de latence, il convient de noter que ces problèmes peuvent être résolus par un thread. Je ne m'inquiéterais pas non plus trop pour Windows 8 et le Push de Microsoft. Google détient une part d’actions de 720 $/action, Apple, de 526 $/action et Microsoft, de 27 $ à ce jour. Même si Apple est susceptible d’être affecté par le Push de Microsoft principalement en raison de l’utilisation de C #, il est probable que Google en profite. Microsoft n'a jamais eu beaucoup de chance face à Google et Google/Android utilise beaucoup Java. Angry Birds a été conçu à l'origine pour Java FYI et porté en C # pour iPhone. Si Google/Android applique la normalisation, Microsoft tombera comme une mouche, emmenant Apple avec eux.

18
C.Jepson

La réponse à votre question est l'illustration et les ressources financières. Et à l’origine, Minecreft a été développé par une personne de Java. Considérant que les titres comme AC ou NFS sont développés par des équipes de milliers de personnes. Comparez les ressources. De plus, Ubisoft utilise le moteur de jeu custrom. Si vous êtes le seul développeur, vous devriez vous concentrer sur l'idée à cause du manque de ressources. Et si vous avez une idée, le collecteur Garbege est indissociable des jeux normaux à développeur unique. Et en tant que développeur unique, vous devez choisir la technologie de développement la plus rapide.

4
fil mihaylov

Je voulais aborder un sujet en marge de cette question, mais la récupération de place n'est pas utile pour créer les aspects de bas niveau et critiques en termes de performances d'un moteur de jeu de type AAA. En fait, il est utile d’éviter ce type de système de référencement et de collecte des objets. Vous voulez que même les types définis par l'utilisateur soient contigus en mémoire et tiennent dans le cache des objets adjacents, etc.

Mis à part les problèmes de performances liés à la collecte des ordures à intervalles réguliers et à la dispersion d'objets en mémoire, les jeux ne peuvent pas se permettre de fuir avec leurs ressources plus volumineuses, et le ramasse-miettes y fait obstacle. Oui, je viens de dire que GC entrave la capacité d’éviter les fuites.

La collecte des ordures n'est pas une solution miracle contre les fuites de ressources.

Aussi contre-intuitif que cela puisse paraître, examinez les applications présentant le plus de fuites d’aujourd’hui: celles pour lesquelles vous les utilisez plus longtemps, plus l’utilisation de la mémoire ne cesse de croître. Généralement, ce ne sont pas des applications C ou C++. Les applications C/C++ peuvent être connues pour les pannes, mais pas pour les fuites. Ceux qui fuient sont beaucoup plus souvent programmés dans les langues avec ramassage des ordures.

Par exemple, prenons des jeux Flash. Il existe de nombreux logiciels, et pas seulement des logiciels amateurs complets, qui utilisent de plus en plus de ressources et ralentissent au fur et à mesure que vous jouez, ce qui vous oblige parfois à redémarrer votre navigateur pour que le jeu redevienne rapide. Pourtant, ils sont codés en ActionScript, un langage à récupération de place.

En théorie, le ramassage des ordures devrait réduire les fuites. En pratique, il élimine souvent les fuites physiques moins coûteuses et plus faciles à réparer (whoops j'ai oublié de supprimer cette chaîne) en échange des fuites logiques beaucoup plus coûteuses et difficiles à isoler (whoops, la logique de le système fait en sorte que des ressources volumineuses s’attardent jusqu’à ce que tout le jeu soit arrêté).

En effet, dans un langage GC, si vous souhaitez créer la propriété partagée d'une nouvelle ressource, R, il vous suffit de stocker un descripteur/une référence dans un autre objet, A. B et C peuvent également stocker un handle sur R, et maintenant R a trois propriétaires et ne sera libéré que si les trois propriétaires libèrent la référence. L'utilisateur voit et travaille uniquement avec ce que A stocke. La logique du jeu implique donc de supprimer R de A périodiquement, mais les références à cette variable persistent dans B et C en silence, ce que le code a oublié de libérer. En C/C++, le pointeur suspendu ici dans B et C peut en fait être préférable, car il entraînerait un problème immédiatement détectable et corrigible pendant les tests de lecture, où le développeur exécutant un débogueur détectera et corrigera rapidement le problème. Dans un langage GC, il est extrêmement difficile à détecter et, même si le programme ne plante pas, il risque de perdre beaucoup de temps.

Donc, GC évite définitivement les pointeurs en suspens, mais si quelque chose était suspendu en C/C++ et ne l'était pas en langage GC, il s'agit d'une fuite de ressource logique dans un langage GC et d'une erreur de segmentation en C/C++. En d'autres termes, le GC échange des pointeurs en suspens contre des ressources en suspens qui traînent pour toujours. Il échange ce qui serait un crash flagrant en une fuite silencieuse qui peut être un cauchemar de débogage à découvrir (et peut même passer inaperçu longtemps après la sortie du produit). Ainsi, pour quelque chose qui ressemble à un jeu qui crée des mondes massifs et dynamiques, des objets graphiques et physiques, etc., et peut-être à chaque image, les fuites de ressources logiques sont un gros problème.

La collecte des ordures est préférable lorsque les fuites de ressources ne sont pas un gros problème.

Ce scénario précédent est malheureusement trop commun dans un environnement d’équipe de grande envergure utilisant GC, en particulier si chaque programmeur n’est pas très prudent face aux pièges de la récupération de place et à la nécessité de références faibles. Donc, GC n'est pas nécessairement un avantage à faire pour créer des jeux, à moins que vous ne parliez uniquement du type le plus élevé de logique humaine. La logique système délicate, de niveau inférieur, qui doit constamment créer, accéder à et détruire des ressources, va généralement mieux, même en évitant les fuites sans celle-ci.

3
Dragon Energy

Il n’est pas tout à fait vrai que le ramassage des ordures n’est pas utilisé dans l’industrie du jeu. Unreal Engine 3 a un garbage collection implémenté pour les classes 'Script'. Pour eux, la performance est acceptable lorsqu'elle est utilisée à la légère. le gros travail est fait par le code C/C++ qui gère sa propre mémoire.

Comme le disait Fortran, Java n’est pas vraiment utilisé dans l’industrie du jeu en raison de préoccupations liées à la vitesse (Java exécute le code sur une machine virtuelle, pas nativement ... la plupart du temps) et parce qu’il existe déjà un grand nombre de programmeurs talentueux qui ont déjà écrit beaucoup de code souvent utilisé en C et C++. Cela ne veut pas dire que vous ne pouvez pas utiliser Java pour créer un jeu, car il existe quelques jeux Java, mais l'industrie du jeu «grand public» a beaucoup investi dans un backend C/C++.

1
James

fortran et James ont déjà assez bien couvert le sujet, mais je voudrais mentionner un autre élément, que Fortran a laissé entendre en parlant d’inertie, est le gigantesque pool de bibliothèques disponibles en C++. Avoir plusieurs bibliothèques C++ pour presque tout ce que vous pouvez imaginer est une excellente raison de ne pas passer à Java. Cela ne veut pas dire qu'il n'y a pas de bibliothèques pour Java pour le moment, mais celles C++ sont déjà matures et ont de grandes communautés de développeurs expérimentés. Ne pas avoir à réécrire la même chose que vous avez déjà fait 1000x est un gain de temps considérable.

0
Gemini14