IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Le langage Java est-il adapté pour les jeux vidéo ? [Débat]


Sujet :

Développement 2D, 3D et Jeux

  1. #241
    Membre confirmé

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Points : 527
    Points
    527
    Par défaut
    Si l'on regarde les papiers de MS à propos de C# par rapport à C++ dans le domaine du jeu, on peut avoir une bonne idée de ce que pensent des professionnels biaisés mais aguerris sur ce débat, car j'ai l'impression que les problèmes de C# dans le domaine du jeu doivent être du point de vue technique très proche de ceux que posent Java. A l'exception du boxing, je pense que le papier est pratiquement entièrement applicable à ce "débat".

    Les arguments avancés dans cette publication sont très cohérents: "Costs a very small amount of performance in exchange for games that never crash due to wild pointers, ever!", "Type-safe reusability", "No buffer overruns, ever!", "Again, trade is rapid development of robust games for performance".
    Ces soucis basiques de "robust games" (crash par pointeurs, buffer overrun et autres bugs) ne concernent pas les jeux à gros budget, où les bugs ont un million de fois plus de chance de venir des autres domaines du développement (la quête qui bloque, les gobelins appelés string_ID_error, le fusil-laser qui pointe pile dans l'œil du Jedi, ...). C++ est massivement utilisé dans des systèmes critiques, que ce soit dans l'armement, la santé, les communications etc. A partir d'un certain seuil de qualité de l'équipe de développement, et les studios pondant les jeux à gros budget atteignent certainement ce niveau critique, parler de crash à cause de pointeur est hors sujet. C'est une autre histoire pour les développeurs individuels.

    Par contre, on peut voir dans le document en lien que les soucis pour maintenir la performance dans des environnement à GC automatique sont loin d'être triviaux (l'importance que lui accorde l'équipe XNA "The GC can be a tough beast to wrangle" pourrait interpeler certains et relativiser certaines affirmations un peu rapides). Pour faire un jeu aux limites de la technique, ce qui contient la totalité des jeux AAA presque par définition, il faut donc effectuer un travail spécifique supplémentaire, d'où une perte de productivité sur ce point précis.

    Quant à la rapidité du reste du développement, il est évident qu'elle dépend de l'infrastructure à laquelle a accès le développeur. Pour un programmeur isolé, des outils ultra simples comme XNA peuvent être attirants, malgré leur manque de contrôle fin ou de puissance. Pour un studio de développement organisé et financé, les outils internes ou middleware puissants en C++ sont certes bien moins simples, mais ne poseront strictement aucun problème à des professionnels, et donc ils peuvent profiter de la puissance et de la maitrise sans s'exposer particulièrement à des pertes d'efficacité de développement.

    Enfin, je rappelle qu'à partir du moment où l'on arrive à mettre suffisamment le GPU à contribution, même Ruby peut exposer des performances époustouflantes (j'ai géré un projet de machine complexe dans lequel le prototype de faisabilité a été bidouillé en Ruby/C#/GPU, nous avons atteint toutes les butées des bandes passantes du PCIe dès le proto). Donc je suis sûr, contrairement à ce qui est souvent remis en question dans cette discussion, que Java peut mettre n'importe quel PC + GPU à genoux avec une efficacité parfaite, après initialisation soigneuse et profilage conséquent.
    Simplement, c'est bien moins simple à faire de façon fiable et industrielle qu'en C++: par simple ré-écriture en C++ du prototype, selon nos méthodologies habituelles de développement, nous n'avons gagné que quelques % en vitesse moyenne, mais nous sommes débarrassé sans coup férir de tous les hoquets intermittents de l'implémentation Ruby/C#. A contrario, il nous aurait fallu plus de temps pour faire le proto en C++ (en l'occurrence, un proto était nécessaire pour des questions fondamentales de faisabilité, ce qui n'est pas le cas d'un jeu dont les performances sont dictées par le PC, et non fixées par les besoins de l'application).
    Par analogie entre le sujet et ce cas de programme à très haute performance en environnement à GC et langage productif et peu rapide, il faudrait que Java soit bien plus productif que C++ pour justifier le surcroit de précaution et de travail. Les jeux à gros budget étant tout bêtement des projets classiques de PME, les mêmes questions qu'ailleurs (C++ vs Java) se posent, avec des réponses similaires.

    Je soutiens que le parallèle fait ici entre C# et Java n'est pas parfait, mais reste pertinent à cause des évidentes similarités entre les problèmes de Java et de C# du point de vue de la programmation des jeux. Il est d'autant plus intéressant que l'équipe XNA, qui a quand même une autre autorité en matière de développement de jeu que tel ou tel effort open source plus ou moins primitif, est le seul soutien officiel de C# et des VMs en général dans les jeux, mais est aussi en charge de DX10 (soutenu officiellement uniquement en C++ dit "natif", càd sans VM), et qu'elle a vainement tenté par le passé de convertir la communauté du développement de jeu vers les langages à VM, en particulier avec managed DirectX, qui a été totalement rejeté bien qu'il ait été entièrement accessible en C++!
    Cet épisode montre s'il en était besoin que ce débat est stérile, ne serait-ce que par la confusion entre contrainte en provenance du langage ou en provenance de la machine virtuelle.

    Donc je vais y aller aussi de mes petites conclusions à propos du sujet "Java est-il adapté aux jeux video?":
    - Oui, Java peut faire hurler le métal. Il y a plus simple, mais on peut, puisque le juge de paix d'un jeu aux limites, c'est le GPU, et qu'au bout d'un moment on est en (xx)SL quel que soit le langage d'origine (j'ai parlé d'un exemple extrême avec Ruby)
    - Non, une VM à GC n'est pas neutre vis-à-vis de la simplicité de maitrise des performances (cf. le papier en lien).
    En conséquence, Java est sans doute adapté, mais pas le plus adapté, et n'est donc pas utilisé, pour de simples raisons pragmatiques. C'est la mésaventure qui est arrivé à Managed DirectX / C++, et même la puissance de MS n'a rien pu y faire.

    Pour moi qui ne fait pas de jeux, mais qui utilise des GPUs, des FPGAs et autre électronique à très haute vitesse en environnement industriel, Java ne présente aucun intérêt particulier par rapport à C++, et par contre présente quelques inconvénients réels. Je comprends donc tout-à-fait pourquoi Java n'accroche pas dans le milieu du jeu.
    "Maybe C++0x will inspire people to write tutorials emphasizing simple use, rather than just papers showing off cleverness." - Bjarne Stroustrup
    "Modern C++11 is not your daddy’s C++" - Herb Sutter

  2. #242
    screetch
    Invité(e)
    Par défaut
    merci pour l'effort d'ecriture argumentée.

    Je pense que le XNA est quand meme encore bien vivant, et ils en feront surement quelque chose. Et certes, Java a des arguments cotés jeu, qui ne sont pas niés, comme C# a des arguments, mais il faut rester conscient des problèmes qui vont se poser (le GC en etant un, le manque de controle sur l'optimisation un autre).

    Finalement, le point fort de java c'est son point faible, c'est ce qu'il sait faire tout seul. D'un coté, c'est une aide au developpeur, de l'autre, une entrave a contourner lorsqu'on sait quoi faire. En ce sens, C++ ne pose pas les memes entraves (non pas qu'il n'en pose pas)

    par contre, le coup du crash a cause d'un pointeur nul, ca c'est de la demagogie. Au lieu d'un crash ca va etre une exception, qui ne sera pas catchée et le jeu entre dans un comportement indeterminé, probablement l'arret. Dans le domaine des jeux, j'y crois meme pas a leur truc.

  3. #243
    screetch
    Invité(e)
    Par défaut
    et pour repondre a Emmanuel aussi, j'avais cité Bullet physics qui est un moteur physique d'une qualité relativement proche de havok (fait par un ancien d'une quelconque bote, peut etre bien ageia) qui tourne aussi avec une version sur PS3 (en utilisant les SPU). et Bullet physics a été porté avec un certain succès en Java.

    Il me semble que c'est justement un des seuls middleware de taille réelle (parce que les benchmarks ce recursion ca saoule) dont une version Java existe (et c'est bien du code java, pas un binding de tricheurs). C'est donc, selon moi, un excellent exemple de la comparaison Java-C++.

    Si quelqu'un peut ici en présenter un résumé... fonctionnent-ils à la même vitesse?

  4. #244
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par ac_wingless Voir le message
    Les arguments avancés dans cette publication sont très cohérents: "Costs a very small amount of performance in exchange for games that never crash due to wild pointers, ever!", "Type-safe reusability", "No buffer overruns, ever!", "Again, trade is rapid development of robust games for performance".
    Attention, les GC ne sont pas la panacée non plus.
    Je préfère un bon crash, qu'un programme qui continue de tourner et qui apparaît sans bug, alors qu'en fait il est buggé, et se coltine des valeurs erronées.

    Un pointeur qui pointe vers un endroit invalide en C/C++, a de bonnes grosses chances de crasher.
    Dans un truc à GC, non.

    Il est alors probable que l'on passe énormément de temps à chercher d'où vient le problème.

    Citation Envoyé par ac_wingless
    Quant à la rapidité du reste du développement, il est évident qu'elle dépend de l'infrastructure à laquelle a accès le développeur. Pour un programmeur isolé, des outils ultra simples comme XNA peuvent être attirants, malgré leur manque de contrôle fin ou de puissance. Pour un studio de développement organisé et financé, les outils internes ou middleware puissants en C++ sont certes bien moins simples, mais ne poseront strictement aucun problème à des professionnels, et donc ils peuvent profiter de la puissance et de la maitrise sans s'exposer particulièrement à des pertes d'efficacité de développement.
    Le C++, c'est quand même spécial. On peut aller très vite comme on peut aller très lentement.

    Beaucoup de choses encore n'utilisent pas les fonctionnalités maintenant classiques du C++, avec les templates, la programmation générique.
    Les bibliothèques qui savent exploiter ça sont en général efficaces, très réutilisables et flexibles.


    Citation Envoyé par ac_wingless
    Donc je vais y aller aussi de mes petites conclusions à propos du sujet "Java est-il adapté aux jeux video?":
    - Oui, Java peut faire hurler le métal. Il y a plus simple, mais on peut, puisque le juge de paix d'un jeu aux limites, c'est le GPU, et qu'au bout d'un moment on est en (xx)SL quel que soit le langage d'origine (j'ai parlé d'un exemple extrême avec Ruby)

    [...]

    Pour moi qui ne fait pas de jeux, mais qui utilise des GPUs, des FPGAs et autre électronique à très haute vitesse en environnement industriel, Java ne présente aucun intérêt particulier par rapport à C++, et par contre présente quelques inconvénients réels. Je comprends donc tout-à-fait pourquoi Java n'accroche pas dans le milieu du jeu.
    Jusqu'à il y a quelques années, je dirais ok.

    Mais maintenant, je serais moins catégorique.
    Regarde Supreme Commander le jeu de stratégie, le bottleneck c'est clairement le moteur physique, le pathfinding, l'IA.

    Combien de parties étaient marquées explicitement "pas de dual core : barrez-vous" en anglais ?
    Ce jeu mettait à genou les processeurs.

    ----

    Après, on peut aussi exploiter le GPU pour faire du GPGPU avec CUDA, mais tout ne se prête pas à la parallélisation massive...

  5. #245
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    A quoi tu pense? A ma connaissance, il n'existe pas, à ce jour, de jeu AAA écrit en C#.

    Effectivement j'étais persuadé que certains jeux AAA était codé en C#, il semblerait que non.

    Je n’ai quasi rien trouvé.

    Juste cet excellent article Microsoft XNA: Ready for Prime Time? qui résume quasiment tout ce que j'ai pu voir sur la toile.

    Une démo fournis par Microsoft Racing Game


    Un dérivé du célèbre moteur Torque à la sauce C# Torque X


    Un Flight Simulator Like -> Flight Simulator Project

    Et Arena Wars et Arena Wars Reloaded développé par Benjamin Nitschke

    Donc effectivement il ne semble pas encore avoir de jeux AAA en C#.

  6. #246
    Nouveau Candidat au Club

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Afghanistan

    Informations forums :
    Inscription : Juin 2003
    Messages : 452
    Points : 0
    Points
    0
    Billets dans le blog
    1
    Par défaut
    de toutes façon la différence entre java et C++ est que
    Le code C++ est transformé directement en code machine,avant l'execution du programme et que pour java le code est transformé en code machine à l'execution ce permet d'ajouter du code pour gérer le GC et d'autre chose.

    Donc dans l'absolu Java peut potentiellement etre aussi puissant que C++ si on ajoute des instructions supplémentaire.


    C'est un choix de Sun de ne pas le faire,mais ce choix peut changé par exemple les générics ont mis un certain temps pour être ajouté à Java.

    Moi ce que je trouve dommage en C++ c'est qu'on ne peut pas creer des classe dynamiquement en mémoire à l'execution comme Java.


    Donc Java est adapté pour les jeux videos

  7. #247
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par screetch Voir le message
    Et certes, Java a des arguments cotés jeu, qui ne sont pas niés, comme C# a des arguments, mais il faut rester conscient des problèmes qui vont se poser (le GC en etant un, le manque de controle sur l'optimisation un autre).
    C# et Java sont différents. Microsoft ne supporte pas .NET sous Linux déjà. C# privilégie l'intégration au système au détriment de la portabilité, Java fonctionne différemment.

    De plus, vous n'écoutez que ce qui vous arrange. Ca fait au moins 2 fois que j'explique qu'on peut paramétrer le garbage collector, notamment choisir l'algorithme qu'il utilise pour réduire la durée des "pauses" et ce genre de paramétrage s'avère très rarement nécessaire. Le garbage collector n'est pas neutre mais il n'impacte pas autant les performances que ce que vous laissez entendre ici.

  8. #248
    screetch
    Invité(e)
    Par défaut
    tu n'ecoutes pas plus. ca fait aussi une paire de fois qu'on te dit que le manque de controle précis sur le garbage collector peut causer des problèmes qu'on a pas en C++.

    je ne pense pas que tu te rendes compte. Au niveau de l'allocation mémoire, j'affiche en temps reel dans le jeu un arbre qui représente l'arborescence du code source sur le disque, avec le nombre d'allocations et la taille de ces allocations, ainsi que le nombre d'allocations faites a cet endroit dans la derniere frame.

    combien de blocs de mémoires sont alloués dans ton jeu ? c'est normal quelque part que le GC ne te pose pas de probleme si tu n'as que quelques centaines de blocs actifs. Le probleme du GC c'est qu'il va fonctionner tres bien sur beaucoup d'endroit, et a un moment il va deconner un peu car le pattern des allocations ne lui plait pas.

    Donc c'est possible avec le GC, bien entendu, mais il faut que les gens sachent qu'ils auront sans doute a farfouiller dans le GC pour eviter les "stalls"

    sois un tantinet realiste aussi, au lieu d'etre parano...

  9. #249
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par screetch Voir le message

    Donc c'est possible avec le GC, bien entendu, mais il faut que les gens sachent qu'ils auront sans doute a farfouiller dans le GC pour eviter les "stalls"

    sois un tantinet realiste aussi, au lieu d'etre parano...
    Je ne suis pas d'accord. Même à mon travail, vu les progrès faits au niveau du garbage collector, les "bidouilles" et paramétrages s'avèrent en très grande partie superflus depuis que nous sommes passés de Java 1.4 à Java 1.6 car la machine virtuelle paramètre plus "intelligement" le GC sans notre intervention que dans le passé. En Java, on peut tout à fait savoir combien de mémoire l'application utilise. Les jeux Java souffrant de "pauses" sont particulièrement rares alors donne des exemples s'il te plaît.

    Enfin, quand un jeu n'est pas open source et qu'on rencontre ce genre de problèmes, on ne peut pas être péremptoire et dire que ça vient nécessairement du GC. Quand le projet est open source, on peut aller farfouiller dans le code, c'est déjà mieux. J'ai deux exemples précis en tête :
    - "flying guns"
    - un petit jeu de solitaire que j'ai trouvé sur sourceforge.net

    Pour le premier, il y avait des pauses assez désagréables car le programme gérait mal le son, le jeu essayait régulièrement d'utiliser des canaux indisponibles et/ou des fréquences non supportées sur ma machine.

    Pour le second, c'est une applet et le programmeur n'avait pas implémenté de cache, il rechargeait complètement chaque image utilisée depuis un site distant à chaque modification de l'interface graphique (le jeu marche normalement depuis que le cache a été implémenté).

    Dans ces deux cas, ça n'avait rien à voir avec le garbage collector. Alors, screetch, as-tu un exemple de jeu Java sur PC qui souffre de pauses intempestives imputables à coût sûr au garbage collector?

  10. #250
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Points : 120
    Points
    120
    Par défaut
    Pour le C#, le GC et le JIT ne sont pas encore suffisamment matures. Ils leur faudra au moins encore 5 ans. Java a commencé le JIT en 1999, et a commencé a être correcte pour une machine moyenne autour de 2003 avec la version 1.4.2. Il faut dire qu'il y a eu beaucoup de recherche dessus, notamment avec le projet Jalapeño (Jikes pour ceux qui connaissent). Le C# est moins en vase clos, ce qui pose des problèmes pour l'optimisation et la gestion de la mémoire.

    Il y a plein d'applications J2EE qui fonctionne de par le monde, et certaines avec des millions d'utilisateurs (ex : TheServerSide). S'il y avait les mêmes problèmes qu'au début du J2EE, cela ferait longtemps que Java serait abandonnée.

    Le gros problème du C++, c'est que l'appel d'une méthode virtuelle est plus lente qu'en Java. Pourquoi : parce que C++ a l'héritage multiple, et qu'il est très difficile de faire de l'optimisation globale en C++ (comme en C). Cela signifie que si tu veux être plus rapide que Java, surtout tu n'utilises pas de redéfinition de méthode. Du coup l'héritage ne sert a rien, et tu as que des classes toutes bêtes que tu utilise comme des "struct" à la C.

    De plus, Java optimise surtout les fonctions qui sont le plus utilisés. Il fait un profilage à la volet ce qui lui fait prendre plus de ressource au processeur, mais est compensé par les optimisations. Le problème avec les compilos, c'est que pour une fonction, ils ne savent pas quel est le chemin qui sera le plus optimisé, et donc, ils utilisent des stats qui peuvent être faussent. De plus, Java peut optimiser en fonction du processeur et ses caractéristiques. En C++, c'est moins possible (il faudrait une DLL par caractéristiques, ou alors en dupliquant le code).

    Java gère mieux la mémoire que n'importe quel compilo C++. En C++, pour chaque new, il y a un malloc, donc un appel système (passage du mode utilisateur au mode noyau, puis retour en mode utilisateur) qui n'est pas très rapide. En Java, il alloue un grand bloc de mémoire au début, et ensuite, pour chaque allocation, il utilise une partie de ce bloc de mémoire. Donc très peu de malloc. De plus, il regroupe les objets proches, ce qui fait qu'il peut mettre sur la même page mémoire des objets qui pointes les uns sur les autres. Adieux le swap et le problème de page mémoire.
    Pour ceux qui préfèrent les allocations sur la pile plutôt qu'en mémoire : http://www.ibm.com/developerworks/ja...-jtp09275.html.
    Pour ceux qui veulent comprendre d'où vient les goulots d'étranglement de leur applications : http://www.ibm.com/developerworks/ja...y/j-ibmtools2/
    Pour ceux qui n'ont toujours pas confiance et qui veulent optimiser leurs GC : http://java.sun.com/javase/technolog..._tuning_6.html (cela ne sert qu'a rassurer ceux qui ont peur. Aucune application n'a besoin de ce genre d'optimisation).

    Enfin, le Java, contrairement au C++ est très sur au niveau du typage. Cela permet d'optimiser considérablement le code machine. En C++, des que dans une méthode tu utilise un pointeur, plein d'optimisations sont désactivées. En Java, il n'y a pas ce problème car il sait qu'un pointeur String ne pointe que sur la classe String, et pas sur un tableau d'entier.

    Comme je l'ai déjà dit, ce n'est qu'une question de mentalité. Quand les grands studio auront conscience que le langage n'a plus trop d'importance pour développer des jeux AAA, ils essaieront sur 1 jeux, puis un autre, et cela suivra. Cela fera comme pour Doom, ou 3d studio max quand ils sont sorties sur PC. Tout le monde disait que ce n'était pas possible, mais cela a marché. Le seul problème, c'est que faire les décors de Crysis par exemple c'est un travail énorme difficile a faire pour un hobbiste seul.

    Dernière chose, pour une équipe qui veut faire un moteur 3D en Java de qualité AAA, si elle préfère gérer elle même la mémoire sans GC, elle peut toujours modifier OpenJDK pour modifier le langage, ou ajouter des instructions à la machine virtuelle.

    Je ne dit pas tout cela pour imposer a tous de passer au Java, mais sur le plan technique, Java est Ok pour faire les Jeux de qualité (et ne parlons pas des outils de développement en Java qui sont ce qu'il y a de mieux actuellement). Maintenant, ceux qui préfère le C++, qu'ils codent en C++, cela ne me pose aucun problème.

  11. #251
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par tulipebleu Voir le message
    Enfin, le Java, contrairement au C++ est très sur au niveau du typage. Cela permet d'optimiser considérablement le code machine. En C++, des que dans une méthode tu utilise un pointeur, plein d'optimisations sont désactivées. En Java, il n'y a pas ce problème car il sait qu'un pointeur String ne pointe que sur la classe String, et pas sur un tableau d'entier.
    Juste ça qui me choque. Précise un peu.

    Le C++ aussi est sûr au niveau du typage, tant qu'on ne joue pas avec reinterpret_cast<>(). Je ne vois pas pourquoi le compilateur désactiverait certaines optimisations juste parce que tu aurais pu jouer au typage.

    Si j'ai un pointeur sur T (T != void), donne moi une bonne raison que le compilateur puisse penser que ce ne soit pas un sous-type de T, ou un tableau de T ??

    A quoi sert le typage dans ce cas ? Par ailleurs, C++ est bien moins laxiste que le C au niveau des pointeurs.

    D'autre part, les pointeurs, on s'en sert rarement directement quand même en C++ quand on n'utilise pas l'héritage, et les tableaux.

    -----------

    Peut-être que tu fais référence à de l'aliasing, quand on a une fonction (d'ailleurs en C++, il n'y a que des fonctions, pas de méthodes) qui a deux références en paramètres vers 2 objets de même type : il ne peut pas supposer qu'ils soient différents, et donc désactive certaines optimisations.

  12. #252
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par IBM
    The malloc/free approach deals with blocks of memory one at a time, whereas the garbage collection approach tends to deal with memory management in large batches, yielding more opportunities for optimization (at the cost of some loss in predictability).
    c'est exactement de ca dont je parle. le probleme est le manque de controle sur le GC. Pour le voir, il faut d'abord le pousser un peu dans ses retranchements avec une appli qui alloue beaucoup de memoire (comme les jeux vidéos AAA), et je voudrais bien voir le GC a l'oeuvre sur 700000 blocks mémoire.

    Le probleme qui arrivera alors sera que le GC va entrer en action sur un temps plus long du fait du nombre de blocs, alors que malloc/free vont rester sensiblement equivalents.

    Et alors les developpeurs en seront quittes pour... diminuer le nombre d'objets sur le niveau ou tweaker le GC avec les parametres obscurs, declenchant peut etre un probleme ailleurs.

    Le C++ permettant de redefinir les operateurs new et delete, tu pourras deplacer les objets dans un pool specifique avec finalement tres peu de code.


    c'est un avantage d'avoir un GC dans un petit projet a moyen, meme un grand projet, ou tu peux te deresponsabiliser du management de memoire.
    pour un jeu AAA, les gens ecrivent toujours leurs propres moteurs de son, leur moteur graphique. ce ne sont pas des developpeurs lambda, ils savent exactement comment fonctionne le jeu et quels sont les objets alloués, etc.
    Et le truc qui gonfle le plus les developpeurs c'est de voir que leur jeu perd des cycles dans un truc qu'ils n'ont pas ecrit eux memes. Dans la plupart des boites, les gens se defont des libs externes si ils le peuvent.

    Je vois dans les resultats du GC que dans leur etude de cas, le GC fait des pauses de 710ms en moyenne. C'est ca qui est inacceptable...

  13. #253
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par screetch Voir le message
    Je vois dans les resultats du GC que dans leur etude de cas, le GC fait des pauses de 710ms en moyenne. C'est ca qui est inacceptable...
    Sur quel lien tu as vu ça ?
    Et 0.7s, tous les combien de temps ?

    Tu dis que c'est inacceptable, mais quelle différence fais-tu avec World of Warcraft qui bloque lamentablement lorsqu'il y a un gros chargement (grosse foule d'un coup) ?
    Un Dark Messiah of M&Magic qui bloque d'un coup lorsque le moteur physique fait un gros calcul alors que je suis sur un truc multi-threadé ?

    D'une part, on peut paramétrer le temps de pause maximal.

    Ensuite, est-ce que ce n'est pas préférable d'avoir plein d'allocations très performantes plus une pause de temps en temps, que plein d'allocations lentes et moyennes ?
    Même si tu utilises un pool, il faudra aussi savoir compacter la mémoire pour préserver la localité.

  14. #254
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par tulipebleu Voir le message
    Le gros problème du C++, c'est que l'appel d'une méthode virtuelle est plus lente qu'en Java. Pourquoi : parce que C++ a l'héritage multiple, et qu'il est très difficile de faire de l'optimisation globale en C++ (comme en C).
    c'est faux, l'heritage multiple est implémenté de facon a ne couter que tres peu. Un appel de methode virtuelle en C++ est plus lent quel que soit l'heritage, sauf si tu fait du profile-guided optimization.

    Citation Envoyé par tulipebleu Voir le message
    De plus, Java optimise surtout les fonctions qui sont le plus utilisés. Il fait un profilage à la volet ce qui lui fait prendre plus de ressource au processeur, mais est compensé par les optimisations. Le problème avec les compilos, c'est que pour une fonction, ils ne savent pas quel est le chemin qui sera le plus optimisé, et donc, ils utilisent des stats qui peuvent être faussent.
    En langage précompilé il y a le "profile-guided optimization" qui permet de lancer l'appli et la recompilé en fonction des benchmarks que le jeu a renvoyé. Ca revient au même.


    Citation Envoyé par tulipebleu Voir le message
    Java gère mieux la mémoire que n'importe quel compilo C++. En C++, pour chaque new, il y a un malloc, donc un appel système (passage du mode utilisateur au mode noyau, puis retour en mode utilisateur) qui n'est pas très rapide.
    oui mais non, il n'y a pas un appel noyau par appel a malloc. malloc fait comme java, alloue un gros bloc et ensuite le manage.

    Citation Envoyé par tulipebleu Voir le message
    Enfin, le Java, contrairement au C++ est très sur au niveau du typage. Cela permet d'optimiser considérablement le code machine. En C++, des que dans une méthode tu utilise un pointeur, plein d'optimisations sont désactivées. En Java, il n'y a pas ce problème car il sait qu'un pointeur String ne pointe que sur la classe String, et pas sur un tableau d'entier.
    Non, toujours non, le C++ a un typage plus fort que le java.
    Que mets tu dans un Array en java ? et qu'est ce que tu obtiens lorsque tu lis un Array ? ben ouais, un Object, que tu dois recaster dans ta classe favorite. tu perds le typage.
    C++ est tres intransigeant au niveau du typage, grace a ses containers qui ne perdent pas le typage

  15. #255
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Sur quel lien tu as vu ça ?
    Et 0.7s, tous les combien de temps ?
    http://www.ibm.com/developerworks/ja...y/j-ibmtools2/, figure 19

    Tu dis que c'est inacceptable, mais quelle différence fais-tu avec World of Warcraft qui bloque lamentablement lorsqu'il y a un gros chargement (grosse foule d'un coup) ?
    Un Dark Messiah of M&Magic qui bloque d'un coup lorsque le moteur physique fait un gros calcul alors que je suis sur un truc multi-threadé ?
    1) C'est du code qu'ils ont ecrit eux memes, qu'ils peuvent changer. Va parametrer ton GC qui fait une pause pour lui dire que tu voulais pas...
    2) Le fait que ce soit non previsible. Tu ne sais pas quelle alloc/dealloc va causer une recollection et tu vas avoir du mal a reproduire. Dans DMOMM si des effets de physiques vont causer un probleme, c'est au level designer de regler le nombre d'objets de l'environnement, ou aux gens d'optimiser la physique.

    Ensuite, est-ce que ce n'est pas préférable d'avoir plein d'allocations très performantes plus une pause de temps en temps, que plein d'allocations lentes et moyennes ?
    NON, surtout pas... pas dans un jeu...

  16. #256
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par screetch Voir le message

    1) C'est du code qu'ils ont ecrit eux memes, qu'ils peuvent changer. Va parametrer ton GC qui fait une pause pour lui dire que tu voulais pas...
    2) Le fait que ce soit non previsible. Tu ne sais pas quelle alloc/dealloc va causer une recollection et tu vas avoir du mal a reproduire. Dans DMOMM si des effets de physiques vont causer un probleme, c'est au level designer de regler le nombre d'objets de l'environnement, ou aux gens d'optimiser la physique.
    Je crois sincèrement qu'aussi bon soit-ils, ils ne maîtriseront pas toutes les allocations/désallocations à tel ou tel endroit.

    En plus, souvent, s'ils le voulaient, ça peut risquer de remettre en cause toute l'architecture, selon la stratégie utilisée. Parfois il n'y a pas de meilleure solution, tu payeras forcément à un moment.

    Optimiser, régler le nombre d'objets de l'environnement, parfois les développeurs sacrifient les performances au gameplay, sinon ce serait parfois ridicule. Il y a qu'à voir Halo 2 sur Xbox, où la console a été poussée à ses moindres retranchements, parfois un peu trop et ça se voit!

    NON, surtout pas... pas dans un jeu...
    Je sais pas si tu as vu, mais on peut paramétrer le temps de pause MAX.

    D'autre part, il faut pas croire qu'on aura des pauses de manières périodiques ! Les pauses elles arrivent presque toujours quand tu te trouves à allouer beaucoup de choses d'un coup !
    Par analogie avec un jeu classique, pendant les gros chargements dynamiques.
    Je suis convaincu que t'y vois que du feu.

    J'ai suis sûr que c'est le genre de trucs qui agit sur la psychologie, qui fait peur sur le papier et provoque une levée de bouclier, mais qu'en pratique ça n'est absolument pas un problème.

    Un peu comme le quicksort et son cas dégénéré de complexité quadratique, mais en réalité tu choisis bien ton pivot avec les bonnes heuristiques, et voilà tu as ton n.log(n) à chaque fois.

  17. #257
    Invité
    Invité(e)
    Par défaut
    Je réitère ma question car je n'ai pas eu de réponses curieusement :

    Alors, screetch, as-tu un exemple de jeu Java sur PC qui souffre de pauses intempestives imputables à coût sûr au garbage collector?

    Citation Envoyé par HanLee Voir le message
    Je sais pas si tu as vu, mais on peut paramétrer le temps de pause MAX.
    Je sais, ça fait 3 fois que je le dis...

    Citation Envoyé par HanLee Voir le message
    D'autre part, il faut pas croire qu'on aura des pauses de manières périodiques ! Les pauses elles arrivent presque toujours quand tu te trouves à allouer beaucoup de choses d'un coup !
    Par analogie avec un jeu classique, pendant les gros chargements dynamiques.
    Je suis convaincu que t'y vois que du feu.

    J'ai suis sûr que c'est le genre de trucs qui agit sur la psychologie, qui fait peur sur le papier et provoque une levée de bouclier, mais qu'en pratique ça n'est absolument pas un problème.
    Ca sert d'arguments alors que personne ici n'a été capable de me trouver un jeu vidéo écrit en Java dont le gameplay souffre des pauses imputables au garbage collector.

  18. #258
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par gouessej Voir le message
    Je réitère ma question car je n'ai pas eu de réponses curieusement :

    Alors, screetch, as-tu un exemple de jeu Java sur PC qui souffre de pauses intempestives imputables à coût sûr au garbage collector?
    tu as un exemple de jeu avec 700000 blocs alloués ?

  19. #259
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Points : 120
    Points
    120
    Par défaut
    Citation Envoyé par screetch Voir le message
    tu as un exemple de jeu avec 700000 blocs alloués ?
    Il faudrait connaitre une application Java qui alloue au moins 700000 objets très souvent, qui est très utilisé et qui ne ralentirait pas.

    Eurêka, j'ai trouvé !

    EBay

    Ils sont passés au Java autour de 2004. A l'époque, ils gérait environs 1 milliards de transactions par jour : http://nerddawg.blogspot.com/2004/06...support-1.html
    Si tu veux un article plus récent (mai 2008) qui prouve qu'ils ne sont pas revenu en arrière :
    http://highscalability.com/ebay-architecture

    Bon maintenant tu vas sur ebay, tu navigues un peu, et tu voix si c'est lent, si ça rame. Si cela ne rame pas, malgré le très grand nombre de visiteur, cela signifie que le GC ne fait pas ramer leur site Java.

    En supposant que le seul objet créer par page, c'est la chaine de caractère du navigateur (aucun accès à la base, aucune concaténation de chaine,etc...), cela fait 1 milliard de chaine de caractère créer, envoyé sur internet puis supprimée. Donc c'est un bon test pour savoir si le GC est lent.

    Si tu veux d'autres exemples d'appli Java plus ou moins grosses :
    ici

    Encore une chose, j'ai testé l'appli http://www.tribaltrouble.com/, et malgré que j'ai augmenté la résolution au max, et que j'ai fait n'importe quoi avec la caméra pendant 20 minutes, je n'ai eu aucun ralentissement.

    Dernière chose, si tu veux voir ce que c'est le HDR en Java :
    http://webuser.hs-furtwangen.de/~der.../hdrtest1.html
    ou
    http://webuser.hs-furtwangen.de/~der.../hdrtest2.html

  20. #260
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Le truc, c'est que pour les grosses applications Web, il y a des systèmes de load balancing sur certains serveurs d'applications pour répartir les tâches entre plusieurs serveurs.

    Du coup, avec une distribution sur 10 serveurs, ça divise bien le nombre d'élément alloué.
    Je ne répondrai à aucune question technique en privé

Discussions similaires

  1. Réponses: 39
    Dernier message: 13/07/2018, 04h48
  2. L’interview technique est-il adapté pour les recrutements ?
    Par Cedric Chevalier dans le forum Actualités
    Réponses: 103
    Dernier message: 08/07/2013, 09h38
  3. [Autre] HTML5 est-il adapté pour les jeux sur le Web ?
    Par Hinault Romaric dans le forum Publications (X)HTML et CSS
    Réponses: 42
    Dernier message: 22/01/2012, 12h17
  4. HTML5 est-il adapté pour les jeux sur le Web ?
    Par Hinault Romaric dans le forum Balisage (X)HTML et validation W3C
    Réponses: 42
    Dernier message: 22/01/2012, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo