Minecraft PE, Minecraft console edition, Minecraft Windows 10 et Minecraft Raspberry Pi sont tous développés en C++.
Minecraft java sera conservé peu importe ce que Microsoft/Mojang fait puisque sans les mods, Minecraft serait sûrement mort depuis longtemps.
Il y a beaucoup de problèmes de conception ou des choses complètement connes du côté de Java :
- Pas de surcharge d'opérateurs. Ça rend le langage incohérent quand on a accès à += sur les String par exemple.
Surtout que ça devient infernal
- L'allocation dynamique est forcée. Le Garbage Collector est forcé.
On a pas conscience du coût de chaque new et de chaque objet qu'on abandonne au niveau des performances. Un exemple probant : Une simple boucle qui par exemple += un élément d'array sur un string. Concrètement "for(machin; bidule; truc) { monString += unArray[trucmuche]; }" ça va pour chaque itération :
- Allouer et construire un StringBuilder
- Copier monString dans le StringBuilder
- Copier unArray[trucmuche] dans le StringBuilder
- Allouer et construire un String
- Copier le contenu du StringBuilder dans le String
- Le Garbage Collector quand il fera ses passes va détruire l'ancien String et le StringBuilder. Et c'est lourd.
Au total : 3 copies, deux objets lourds donnés à bouffer au GC chaque itération.
Alors qu'en C++ :
- Vérifier si l'espace réservé dans le std::string est suffisant pour copier l'élément
- Si non, il va allouer un nouveau std::string avec suffisamment de place et copier le contenu de l'ancien std::string dedans
- Copier unArray[trucmuche] dans le std::string
Au total : Une ou deux copies, un objet lourd détruit au maximum
Et si on connaît d'avance ce qu'il y a à rajouter (en nombre de caractères) :
- Vérifier si l'espace réservé dans le std::string est suffisant pour copier l'élément (toujours assez)
- Copier unArray[trucmuche] dans le std::string
Au total : Une copie.
- Les Generic n'ont aucune puissance face aux templates du C++. Par exemple, si vous voulez faire une fonction qui fait "a + b" avec deux nombres de manière générique (donc on pourrait y passer des Integer, des Float, etc., car oui, les Generic ne peuvent pas prendre de types natifs non plus), bah... C'est pas possible en fait en Java. En C++, ça se résume à utiliser une template toute simple.
- Quelle est la différence entre la référence Java et un pointeur C++? Aucune, en fait. Sauf qu'en Java, ils sont bridés comme pas possible. Quand on a un objet de classe "MaClasse", il peut être null. En C++, si on respecte l'idiome RAII, il existe dans tous les cas, car il est présent sur la stack dans la plupart des implémentations. C'est d'ailleurs largement plus performant au niveau des allocations/désallocations parce qu'elles sont quasi littéralement gratuites. En Java, c'est de l'allocation dynamique (ce qui est plus lent). Les références C++ donnent la même garantie si on ne fait pas n'importe quoi (il s'agit d'une syntaxe différente pour des pointeurs constants).
- Le Java, c'est plus lent que le C++. Peu importe ce que certains disent.
Edit : La lenteur de Minecraft PC n'est pas que due au Java, hein. Y'a aussi le fait que le jeu est complètement codé avec le cul, ça aide pas trop.
Edit 2 : Ah et, en C++ >11, j'ai que rarement à faire avec des pointeurs. Quand on utilise des pointeurs intelligents (qui s'occupent de l'allocation/désallocation comme des grands), on a plus besoin de gérer manuellement (comprendre new et delete) la mémoire du tout.