Je suis curieux de savoir pourquoi C ++ est si populaire pour le développement de jeux, et pas d'autres langages à la place. Je sais que vous pouvez créer du code très rapidement avec lui, mais qu'est-ce qui le rend populaire?
Est-ce juste parce que c'est rapide? Est-ce une autre fonctionnalité du langage, comme le paradigme OO ou la portabilité? Est-ce à cause de toutes les bibliothèques qui ont été créées au fil du temps? Ou une combinaison de toutes ces raisons (et d'autres)?
Si quelqu'un pouvait me renseigner là-dessus, je serais très heureux. :-)
Réponses:
De nombreuses raisons:
la source
Il y a plusieurs raisons que j'aimerais mentionner en plus de ce que @Graham a évoqué.
la source
low-level
langage; mais unhigh-level
assembleur, l'OMI.La vitesse brute est la principale raison, mais en fait, ce n'est pas une décision ou alors de nombreuses sociétés de jeux commencent à utiliser d'autres langues pour certaines parties du jeu. Certaines tâches nécessitent que l'ordinateur fonctionne le plus rapidement possible (par exemple, les routines de rendu de base), mais de nombreuses tâches dans le code de gameplay n'ont pas à s'exécuter aussi rapidement (par exemple, ouvrir la porte lorsque le joueur clique dessus), ce qui signifie que est intelligent d'utiliser un langage beaucoup plus simple (et donc plus rapide pour écrire des programmes) pour ces parties. C'est pourquoi de nombreux moteurs de jeu sont écrits en C ++ mais intègrent un langage de script comme Lua pour écrire du code de gameplay.
La chose délicate à comprendre est que lors du choix des langages de programmation, il y a un compromis global entre l'efficacité pour l'ordinateur et l'efficacité pour le programmeur. Autrement dit, ce qui est plus important pour vous, à quelle vitesse l'ordinateur exécute le code ou à quelle vitesse le programmeur écrit-il le code?
la source
En C ++, vous pouvez allouer des variables locales qui disparaissent après la fin de la fonction. Habituellement, ceux-ci sont alloués sur une pile.
Les variables de pile ne contribuent pas aux problèmes d'allocation de mémoire dynamique de fragmentation et de surcharge. Allouer de la place sur la pile est rapide et facile (il suffit de régler un pointeur). L'allocation dynamique de mémoire implique généralement de rechercher dans un conteneur un bloc de mémoire adéquat, de marquer la mémoire, puis de la marquer comme occupée. La désallocation implique l'ajout du bloc de mémoire à un conteneur, et éventuellement sa fusion avec des blocs existants. Beaucoup plus de frais généraux que de simplement changer un pointeur.
Java et C # allouent la mémoire dynamiquement, sauf pour les types primitifs. Ces langages dépendent d'un environnement d'exécution qui marquera une variable à supprimer, puis exécutera un garbage collector à des intervalles aléatoires (non planifiés) pour récupérer la mémoire. En général, le programmeur n'a aucun contrôle sur le moment où la variable sera balisée pour la suppression ni quand elle sera récupérée (la récupération de la mémoire utilisée est un sujet avancé que la plupart des programmeurs C ++ et Java ne connaissent pas).
La vitesse de C ++ est principalement due à sa traduction directe en code exécutable. Java et C # sont compilés en un code intermédiaire qui est ensuite interprété par une machine virtuelle. En général, les langues interprétatives sont plus lentes que les langues directement traduites.
la source
structs
. Plus précisément, la très très augmentation de petite vitesse ce filets vous n'est pas presque assez pour justifier une langue sur l'autre. La vraie raison est indiquée par @Graham Perks: c'est ce que les développeurs de jeux sont censés savoir, c'est donc ce que les nouveaux développeurs de jeux apprennent, et à quoi s'adressent les nouveaux SDK. Il y a beaucoup de langues (ex. Go) qui sont tout aussi rapide ou plus rapide, et non presque aussi peu pratique à écrire.Les jeux étaient autrefois écrits en langage machine, car ils avaient du matériel exotique pour lequel il n'y avait pas de compilateur. Le matériel manquait également de fonctionnalités que les programmeurs C tiennent pour acquises, telles que des mathématiques entières 16 bits efficaces.
Une fois les jeux installés sur du matériel familier, les compilateurs C sont devenus disponibles et en peu de temps, tous les jeux ont été écrits en C.
Le C ++ semblait être une bonne idée à un moment donné, et la plupart des jeux sont aujourd'hui du C ++, mais les ingénieurs marmonnent maintenant à propos d'un retour au C, et cela pourrait en fait arriver. J'adorerais travailler sur un jeu en C, tout comme de nombreux collègues. Il n'y a aucune fonctionnalité nouvelle en C ++ qui, je pense, améliore les jeux.
Il semblerait maintenant que les ordinateurs sont 1000 fois plus rapides qu'il y a quelques années, un langage de haut niveau réduirait le temps de développement ($) rendant le C obsolète.
Cela ne s'est pas produit car les acheteurs de jeux savent que le matériel est 1000 fois meilleur et veulent échanger leurs dollars contre un jeu qui ressemble et sonne 1000 fois mieux. Cela supprime le jeu du système qu'une langue de haut niveau consommerait.
Les exigences de performances dans les jeux sont brutales. Un nouveau cadre graphique doit être rendu en moins de 33 ms (ou 16 ms!) Sans faute. Tout ce que fait le matériel doit être pris en compte, afin que ce budget puisse être respecté. Tout langage qui se déclenche et fait quelque chose avec le matériel que le programmeur ne comprend pas ou attend, va rendre très difficile le respect de ce budget. Il s'agit d'un inconvénient automatique contre tout élément de haut niveau.
Les programmeurs de jeux fonctionnent non seulement dans un langage de bas niveau, mais ils évitent également les structures de données et les algorithmes de haut niveau. Les jeux n'ont généralement pas de listes chaînées et ont rarement des arbres. Il y a un mouvement pour éviter les pointeurs dans la mesure du possible *. Tout algorithme avec plus de temps O (N) ou d'espace O (1) a tendance à ne pas être largement utilisé.
* Si un pointeur ne provoque pas un échec de cache, alors pourquoi dépenser 32 bits pour le stocker? Si un pointeur provoque un échec de cache, mieux vaut se débarrasser de cet échec de cache.
la source
human
avec des dérivésplayer
etenemy
?Tous les langages de programmation ont des forces et des faiblesses à travers une gamme de facteurs. Des exemples de ces facteurs sont:
L'un des facteurs les plus importants qu'un programmeur de jeux se soucie est la performance. Ils veulent produire une expérience interactive, ce qui signifie qu'elle doit être réactive et capable de produire autant de données utiles (ou intéressantes) que possible. Vous voulez savoir à tout moment combien de santé vous avez et vous ne voulez pas l'attendre. Et si vous cliquez sur un bouton, vous vous attendez à ce qu'un pistolet tire ou que votre personnage saute lorsque vous le dites. Un petit décalage peut interférer avec cette interactivité, vous avez donc besoin de performances.
Un autre facteur important est de préférer programmer dans la langue du problème, plutôt dans la langue de l'implémentation. Un programmeur de jeux veut gérer les humains, les orcs et les voitures de course, pas le registre de mémoire ED0. Ils veulent toujours avoir la possibilité de plonger dans les détails de l'implémentation s'ils ont besoin de performances, mais ce serait génial s'ils pouvaient pour la plupart traiter avec le niveau des entités dans leur monde de jeu. Ils ont assez à se soucier de simuler le monde du jeu sans avoir à se soucier toujours du fonctionnement d'une liste chaînée.
C ++ correspond très bien à ces deux facteurs principaux. Vous pouvez avoir les avantages de performance de l'assemblage ou du code C avec l'expressivité des objets. Pour voir pourquoi c'est un choix naturel pour les jeux, comparez avec d'autres options de langue:
Le dernier point est qu'une partie de cela est historique et politique. De nombreuses guerres de flammes ont été menées entre les différents langages de programmation. C # par exemple pourrait être tout aussi adapté au développement de jeux, mais il est venu après C ++. Ou les gens n'aiment pas que ce soit de Microsoft. Certaines personnes sont passées au C #, d'autres non. Certaines personnes continuent de programmer des jeux en BASIC, Pascal et C. Quels que soient les programmeurs qui s'y sentent à l'aise, ils s'y tiendront. Les programmeurs de jeux sont généralement à l'aise avec C ++, peut-être parce qu'ils ont grandi avec C et C ++, et qu'il répondait à leurs besoins. Si l'industrie informatique est dans un état où les performances et l'adoption de Java satisfont suffisamment de gens, alors peut-être que Java serait le langage de développement de jeu standard de facto.
la source
Héritage et élan.
Il était une fois un code temporel écrit en assembleur pour des performances optimales. À mesure que la puissance de calcul augmentait, les langages compilés devenaient plus viables et C offrait le meilleur compromis entre puissance et productivité, à un niveau très basique étant à peine plus qu'un macro assembleur.
C ++ n'était que le successeur naturel de C. Vous ne jetez aucun ancien code ou connaissance, mais avez le potentiel de vous étendre à de nouvelles méthodologies. Le C ++ est finalement très flexible, et je n'ai pas encore vu de paradigme de conception qui ne puisse pas au moins être simulé en C ++, tout en étant capable de maintenir un contrôle quasi total sur les performances.
la source
Si vous développez pour les consoles, vous n'avez pas le choix: les SDK professionnels ne sont disponibles qu'en versions C ++. Habituellement, ils ont également accès C à la plupart des choses.
Étant donné que de nombreux développeurs sont des consoles + PC, il est logique de faire tout leur travail sur PC dans le même langage et de partager directement la technologie.
Parce que c'est là que vit l'industrie professionnelle, et que presque tout le monde veut en faire partie, la plupart des programmeurs de jeux sont des programmeurs C ++.
Parce que tout cela se produit, la plupart des développeurs de moteurs sont également des développeurs C ++, donc lors de l'évaluation de moteurs de qualité professionnelle, presque tous vos choix seront C ++.
C'est tout un gros moteur autonome. Le perturber nécessiterait plus qu'un simple progrès technique.
la source
FWIW: C # gagne en popularité pour le développement de jeux. Voir le blog de Miguel de Icaza . Lecture très intéressante, à mon humble avis.
la source
Bien que je sois assez fortement anti-C, C & C ++, la seule chose qu'ils ont que peu d'autres langages ont est un contrôle complet sur la plate-forme sur laquelle il fonctionne, vous pouvez être sûr de ce qui se passera à tout moment, non GC, pas de pépins.
Ce n'est pas aussi important de nos jours, mais cela peut être pour les plateformes sous-alimentées.
Sur PC / Mac / Linux, c'est probablement le langage le moins portable que vous rencontrerez ces jours-ci, et le bonus de vitesse n'est plus très différent - Minecraft (Java) est fluide et fonctionne sur des plates-formes assez minimales (et tout système d'exploitation) avec un seul exécutable - je n'ai pas encore vu une application indi C / C ++ à faible effectif avec autant de fonctionnalités et aussi peu de bugs, sans parler de travailler sur trois plates-formes.
Donc, à ce stade, je dirais que la majeure partie est l'inertie et la conception que les vrais jeux sont toujours faits en C / C ++, bien que la capacité de "porter" sur iPhone et consoles soit importante (même si je suis assez sûr que la plupart de l'interface utilisateur des jeux prennent beaucoup d'efforts pour le portage, sauf entre Windows et XBox).
la source