Pourquoi le C / C ++ est-il préféré pour les développeurs de jeux?


14

Certaines personnes disent qu'il offre plus de contrôle aux développeurs, mais qu'est-ce qui peut être contrôlé précisément via C ++ qui ne peut pas être contrôlé en utilisant, par exemple, Java?

Réponses:


21

Java s'exécute sur une machine virtuelle, tandis que C ++ s'exécute directement sur le matériel. Cela signifie que vous avez plus de contrôle sur l'emplacement de votre mémoire et ce que vous en faites en C ++.

Java est un langage récupéré. Vous n'avez pas de contrôle direct sur votre mémoire. Vous pouvez allouer de nouveaux morceaux de mémoire, mais vous n'avez pas de contrôle (fin) sur le moment où il est supprimé. Le garbage collector vérifie chaque morceau de mémoire que vous avez alloué toutes les x trames et détermine s'il s'agit d'ordures ou encore utilisé.

Pour les jeux, cela peut être désastreux. Toutes les quelques images, un ramasse-miettes vient vérifier chaque allocation que vous avez faite pour voir si elle est toujours utilisée? Parlez d'un ralentissement!

Deuxièmement, la plupart des bibliothèques que nous utilisons ont été écrites en C ou écrites en C ++. Je parle de Scaleform, du moteur physique Havok, de PhysX, de SpeedTree, etc. Tous les packages professionnels, largement utilisés dans l'industrie. Si une autre langue veut être roi, il vaut mieux les soutenir.

Mon opinion personnelle est que Java est vraiment bien pour les applications de bureau et les applications, mais pas pour les jeux. Java a beaucoup de bons outils pour les développeurs et il peut théoriquement être exécuté sur n'importe quelle plate-forme qui a une implémentation de la machine virtuelle Java, mais je préfère toujours C ++ parce que j'ai besoin de ce contrôle sur ma mémoire. Surtout lorsque vous commencez à travailler avec des structures de données exotiques (arbre rouge-noir, liste doublement liée, etc.), cela permet de garder une bonne vue d'ensemble de toutes vos allocations de mémoire.

Je ne dis pas: n'utilisez pas Java. Je dis: réfléchissez à la raison pour laquelle vous utilisez Java. Minecraft a été construit en Java, il est donc certainement possible de créer des jeux en Java. Mais aurait-il été un meilleur jeu s'il avait été construit en C ++? Eh bien, il n'aurait certainement pas été aussi bon marché de le faire fonctionner sur les trois grands (Windows, MacOS, Linux), mais même ainsi, il a rencontré beaucoup de bogues spécifiques à la plate-forme dans son développement, des bogues que Java ne pouvait pas résoudre. plus de.

Il existe maintenant des tonnes de frameworks C ++ pour les programmeurs débutants. Il n'y a vraiment aucune excuse pour ne pas l'apprendre, surtout si vous souhaitez poursuivre votre carrière dans l'industrie.


1
Un simple coup de pouce, mais dans la plupart des environnements d'exploitation, le code natif s'exécute sur une machine virtuelle. Java s'exécute dans une machine virtuelle à l'intérieur d'une machine virtuelle.
Skyler Saleh

1
@RTS: C'est un peu exagéré d'appeler op -> micro-op translation une machine virtuelle, si c'est ce que vous voulez dire.

Non, je parlais de la machine virtuelle dans laquelle toutes les applications sont installées par les systèmes d'exploitation modernes pour permettre un multitâche sûr. Cela se produit sur les systèmes d'exploitation qui s'exécutent sur des architectures sans micro-opérations (RISC). Cela inclut la mémoire virtuelle, les interruptions logicielles, les systèmes d'accès simultané au matériel, le planificateur des systèmes d'exploitation et la gestion du fichier de registre.
Skyler Saleh

@RTS Je ne suis pas sûr que l'isolement des tâches soit vraiment considéré comme une machine virtuelle. C'est un RM (Real Machine) avec une certaine protection intégrée. Il n'y a pas de couche d'abstraction d'instruction évidente entre fetch / exec. Les compilateurs et les éditeurs de liens génèrent un code déplaçable comme exigence. Le CPU fournit un support matériel pour une grande partie de cela - ce qui supprime l'aspect "virtuel".
3Dave

2

Réponse courte: C ++ compile en code natif, donc les performances dépendent du développeur, pas d'un runtime ou d'une VM.

Longue réponse:

C ++ étant "plus rapide" n'a rien à voir avec C ++. À l'heure actuelle, il s'agit de l'une des rares langues disponibles prises en charge par des outils qui produisent du code natif autonome pour plusieurs plates-formes.

À l'époque, vous pouviez utiliser C, C ++, BASIC / 2, Delphi, etc., et obtenir des exécutables autonomes et efficaces. Le choix de la langue était une question de préférence personnelle et de forces du marché.

De nos jours, l'hypothèse que "C ++ est plus rapide" est essentiellement une prophétie auto-réalisatrice, bien que LLVM soit en bonne position pour changer cela car il fait tout ce qui entre dans le moot de l'analyseur, comme il l'était autrefois.

Borland avait raison: plusieurs langues analysées, les premières optimisations appliquées, puis transmises à un compilateur et un éditeur de liens communs. Ce qui est effectivement l'une des principales réalisations des LLVM.

Java est structuré de telle manière qu'il serait très difficile de l'implémenter sans la JVM. Curieusement, C #, communément et incorrectement, supposé être à peu près équivalent à Java, se compile déjà en code natif sur plusieurs plates-formes, y compris iOS.

Haut de ma liste de Noël? Une machine à remonter le temps pour ajouter des propriétés, une véritable gestion des exceptions et un véritable polymorphisme WORKING au C ++, et se débarrasser de la merde de la syntaxe de la flèche vers le haut que l'analyseur peut comprendre par lui-même. J'ai écrit un préprocesseur pour ces 10 années il y a parce que c'est vraiment stupide.


Voulez-vous dire l'accès indirect des membres (comme dans h-> x)? Supprimer cela rendrait les types de poignée et de pointeur intelligent beaucoup moins utiles. Si vous prétendez le changer uniquement pour les pointeurs bruts, vous venez de rendre le langage moins cohérent.
Lars Viklund

1
Qu'est-ce qui ne fonctionne pas avec le polymorphisme de C ++?
Casey

@LarsViklund oui, c'est ce que je veux dire. Mais, alors que les opérateurs d'adresse, de déréférencement et de membre (&, *, ::, -> ...) ont tous des significations différentes, la plupart du temps il est possible d'inférer le résultat drsjted du contexte. Les choses auraient pu être simplifiées dès le départ, comme cela se fait dans d'autres langues. Un petit point de blocage, mais qui a le potentiel d'augmenter la complexité du code (et donc le temps et les coûts de développement).
3Dave
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.