Tout d'abord, je voudrais avoir une vraie réponse, j'essaie toujours d'obtenir plus de diverses sources et articles, et quand je lis des choses comme C ++ est lente parce qu'elle a des fonctions virtuelles et à cause de cela C est mieux , je vraiment Je ne sais pas quoi dire et penser en tant qu'être humain avec un cerveau. Veuillez donc éviter d'atteindre ce niveau dans votre / vos réponse (s).
Ma question concerne un passage massif au C ++ qui a été réalisé, plus ou moins, avec Doom 3.
Ce qui est intéressant pour moi, c'est qu'avant cette étape, la plupart des moteurs de jeu et les jeux eux-mêmes étaient écrits en C, comme c'était le cas depuis l' ère Quake . Il est également intéressant de noter que le logiciel d'identification décide de réécrire complètement la base de code de l'IdTech 4 en C ++, une énorme quantité de travail que je ne peux honnêtement pas comprendre sans une très bonne liste de raisons.
Je me concentre sur Doom 3 parce que je suis principalement intéressé par le monde OpenGL et dans mon voyage j'essaie de rester concentré sur ce sujet, donc j'ai lu beaucoup de choses à ce sujet, mais je pense qu'une question comme celle-ci peut être render-API -agnostique sans trop de problèmes.
Pourquoi à un certain moment, l'industrie est passée massivement au C ++? Quelles sont les raisons du choix de cette pièce d'identité?
La dernière chose que je voudrais dire, c'est que le langage C est beaucoup plus simple à implémenter et offre moins de fonctionnalités, car il a beaucoup moins de chances d'être "fragmenté" en morceaux contrairement au C ++ le fait souvent. En termes plus simples, j'ai beaucoup plus de chances de trouver un très bon compilateur C plutôt qu'un bon compilateur C ++ avec toutes les fonctionnalités implémentées dans le bon sens.
Par exemple, le NDK pour Android n'a toujours pas un bon support C ++ (avec la version r8b) avec toutes les dernières et meilleures fonctionnalités, et c'est la boîte à outils native pour le système d'exploitation mobile le plus populaire au monde!
Si j'avais écrit mon code dans un C ++ moderne, j'aurais probablement mal maintenant parce que l'un des systèmes d'exploitation les plus populaires au monde serait interdit pour moi. Et comme Android, de nombreux autres compilateurs ne sont pas si géniaux.
Je devrais écrire du code C ++ faisant référence à une version C ++ datant de 2-3 ans?
Réponses:
C ++ fait tout ce que fait C. Vous pouvez mélanger trivialement C et C ++ dans les cas où les avantages de C l'emportent sur ceux de C ++. Il s'agit d'une décision de conception très intentionnelle de C ++.
C ++ fait des choses que C ne fait pas. Cela inclut un polymorphisme facile, mais aussi une génération de code temporel de compilation facile via des modèles. C'est vraiment pratique pour des choses comme les conteneurs, qui sont facilement la plus grande faiblesse de C. Il permet également les types de pointeurs définis par l'utilisateur (poignées intelligentes) qui permettent de gagner beaucoup de temps, ainsi que les types de type primitifs définis par l'utilisateur tels que les vecteurs et les matrices avec prise en charge par l'opérateur (économisent également beaucoup de temps).
Les fonctions virtuelles sont plus lentes que les fonctions non virtuelles. Cependant, vous devez activer les fonctions virtuelles, et un programmeur compétent ne le fait que lorsque cela est avantageux. Les programmeurs C ont des pointeurs de fonction et stockent souvent des collections de ceux dans la structure référencée par d'autres structures; en d'autres termes, ils effectuent un travail supplémentaire pour recréer exactement la même chose que les tables de fonctions virtuelles. Dans les cas où un seul pointeur de fonction est nécessaire et aucune table n'est requise, C ++ le permet toujours pleinement et est équivalent à C. Avec un compilateur moderne, C ++ n'est plus lent que C dans les cas spécifiques où le programmeur choisit une fonctionnalité . En outre, la surcharge de fonction virtuelle dans la pratique est très faible sur les processeurs de modem. Aujourd'hui, le matériel est conçu pour les modèles d'utilisation de C ++ et est de plus en plus conçu pour les besoins de langages interprétés de haut niveau.
Les exceptions C ++ imposent historiquement beaucoup de surcharge, rendant C ++ plus lent même si vous ne les utilisez pas. Les exceptions étaient une chose terrible à ajouter au C ++, si ce n'est pour une autre raison que l'immense augmentation de la complexité impliquée dans l'écriture de code protégé contre les exceptions, et en fait, certaines conceptions de conteneurs sont littéralement impossibles à rendre les exceptions sûres. Les programmeurs de jeux ignorent souvent l'existence des exceptions et les désactivent même sur le compilateur. Les compilateurs modernes ont des exceptions sans frais généraux (c'est-à-dire que vous ne les payez que lorsque vous les utilisez réellement).
C est plus simple d'apprendre toutes les règles de. C ++ est un langage très gros et complexe. C ++ permet d'écrire du code de niveau supérieur, produisant des API plus simples et plus simples. Certaines personnes veulent comprendre le langage plus facilement, d'autres veulent écrire du code avancé plus facilement. C'est un compromis entre la simplicité de compréhension de ce que le compilateur fait avec un morceau de code spécifique et la simplicité d'écriture de grandes applications complexes interconnectées. Certaines personnes apprécient beaucoup plus que l'autre, pour diverses raisons.
En fin de compte, C ++ est un surensemble de C. À mon avis, il n'y a rien de tel qu'un programmeur C ++ hautement compétent qui n'est pas aussi un programmeur C passable (bien qu'il y ait beaucoup de programmeurs C ++ qui tombent en dessous de ma barre qui le feraient) se perdre en C pur). Alors que C ++ ajoute des fonctionnalités pour isoler le programmeur d'une grande partie de C, le code C ++ non trivial a souvent besoin d'utiliser C pour faire avancer les choses. C'est l'une des principales différences entre C ++ et Java et C #. Il y a une raison pour laquelle vous voyez souvent "C / C ++" regroupés, après tout.
Ma conviction personnelle - qui est partagée avec la plupart des autres professionnels de l'industrie des jeux avec lesquels j'ai interagi - est que l'expressivité améliorée et les installations de programmation de haut niveau de C ++ l'emportent sur la complexité accrue du langage par rapport à C, et la plupart des autres fréquents les affirmations anti-C ++ sont simplement obsolètes par rapport à la technologie d'aujourd'hui.
la source
Id Software n'est pas "l'industrie". Ils sont une seule entreprise. Bien qu'ils puissent être influents, ils ne sont pas tous.
J'ai travaillé sur quelques moteurs de jeux qui remontent à 1999, et ils ont utilisé C ++.
Les principales raisons de l'adoption du C ++ "à cette époque" sont les suivantes:
C'était standardisé . C ++ 98 est nommé ainsi car il a été publié en tant que norme ISO en 1998. Jusque-là, il y avait plusieurs dialectes de C ++ sans aucune idée claire qui était "réelle" ou "correcte". Une fois qu'il a été normalisé et que les compilateurs ont commencé à implémenter la norme, les développeurs de jeux pouvaient s'appuyer sur la norme actuelle.
Rappelez-vous la vieille blague: un gars entre dans le cabinet d'un médecin et dit: "Ça fait mal quand je lève mon bras comme ça." Alors le docteur dit: "Alors ne lève pas le bras comme ça."
Si les fonctions virtuelles sont lentes pour vos besoins, C ++ ne vous oblige pas à les utiliser. Tout en C ++ est opt-in. Vous choisissez d'utiliser chaque fonctionnalité particulière. Si vous utilisez du code critique pour les performances et que vous ne voulez pas de surcharge virtuelle, vous n'utilisez pas de fonctions virtuelles. Tout comme si vous utilisez du code critique pour les performances en C, vous n'utilisez pas de pointeurs de fonction.
En effet, cela a conduit beaucoup de jeux C ++ à ne pas être du C ++ idiomatique (du moins, pas du C ++ idiomatique moderne ), mais simplement du "C avec des classes". Et c'est une façon parfaitement fonctionnelle de programmer C ++. Enfer, le simple fait de ne pas avoir à taper
typedef struct
lorsque vous créez un nouveau type est un avantage.C ++ est un grand sac de fonctionnalités, et vous pouvez choisir celles que vous souhaitez.
Votre point étant? Google tolère à peine les personnes utilisant NDK; il est clair qu'ils veulent que tout le monde utilise Java. La seule raison pour laquelle NDK existe est qu'il existe certains développeurs importants qui n'utiliseront tout simplement pas la plate-forme sans elle. Ainsi, NDK existe pour les entretenir et leurs besoins en fonctionnalités.
Oui, C ++ est une spécification plus grande et plus compliquée à implémenter. Java aussi. Il en va de même pour toutes les langues sauf C.
Aussi, que voulez-vous dire par "toutes les fonctionnalités les plus récentes et les meilleures"? Si vous parlez de trucs C ++ 11, eh bien, personne ne l'implémente complètement encore. La spécification a à peine un an maintenant. De plus, je ne sais pas non plus si NDK prend en charge C11; oui, C dispose également de "dernières et meilleures fonctionnalités" qui ne sont pas prises en charge partout.
Ce qui soulève un point important: si vous voulez que votre application pure-C compile sur Visual Studio, elle doit être conforme à C89, et rien de plus que cela. La fragmentation avec C existe donc déjà. Certaines plates-formes prennent uniquement en charge C89. Certains soutiennent C99. Certains soutiennent C11, à des degrés divers. Etc.
Si vous souhaitez utiliser C, puis utiliser C . Le fait que d'autres personnes n'aient pas fait ce choix ne signifie pas que votre choix est faux ou que leur choix est faux. Vous n'avez pas besoin de vous justifier auprès d'eux, et ils n'ont pas besoin de se justifier auprès de vous.
la source
Il était courant pour eux de réécrire à peu près tout le moteur pour chaque version (au moins jusqu'à récemment - je ne sais pas grand-chose sur les derniers jeux), et puisque C ++ gagne en popularité, il est logique de l'utiliser plutôt que de coller avec C. Avec le temps, de moins en moins de personnes vont être compétentes avec C.
Parce qu'il vous offre de nombreuses fonctionnalités de niveau supérieur tout en étant presque entièrement rétrocompatible avec le code C.
Google aurait répondu à cela pour vous: http://fabiensanglard.net/doom3/interviews.php
"... la moitié des programmeurs avaient vraiment des antécédents C ++ au début. J'avais des antécédents C et Objective-C, et j'ai en quelque sorte" glissé en C ++ "en regardant simplement le code que les gars C ++ écrivaient. Avec le recul, je J'aurais aimé avoir le temps de faire des recherches approfondies et d'explorer la langue avant de commencer à l'utiliser.
Vous pouvez toujours être en mesure de dire que le code de rendu a été largement développé en C, puis en quelque sorte skinné en C ++.
Aujourd'hui, je crois fermement que C ++ est le bon langage pour les grands projets multi-développeurs avec des exigences de performances critiques, et Tech 5 est beaucoup mieux pour l'expérience Doom 3. "
Pourquoi vous souciez-vous de cela? Ne soyez pas pris au piège à courir après la dernière chose. Si c'était assez bon il y a 5 ans, ça n'aura pas soudainement empiré maintenant.
la source
Eh bien, C ++ est sorti depuis les années 80, donc si un compilateur ne le prend pas en charge, vous devriez peut-être utiliser un autre compilateur. Et aussi, C ++ n'est pas vraiment beaucoup plus lent que C. Il n'est vraiment plus lent que si vous le chargez avec des fonctions virtuelles et d'autres abstractions. Cependant, C ++ est beaucoup utilisé aujourd'hui dans le monde non unix en raison de sa flexibilité et de ses nouvelles fonctionnalités que C ne possède pas. Écrire du code modulaire en C ++ est beaucoup plus facile que de le faire en C et vous aide à écrire du code plus portable. De retour au sujet des compilateurs, je ne connais aucun compilateur qui ne prend pas en charge C ++ (peut-être pas C ++ 11 complètement, mais tout compilateur à moitié décent devrait prendre en charge C ++).
la source