Même si C ++ semble être roi, d'après ce que l'on m'a dit, C est encore largement utilisé dans les jeux, en particulier sur les consoles. Cependant, l'écriture d'un moteur de jeu entier en C serait-elle déraisonnable aujourd'hui? Quels sont, le cas échéant, certains avantages du C par rapport au C ++? Pourquoi quelqu'un voudrait-il éventuellement utiliser C sur C ++?
53
Réponses:
C'est raisonnable, mais la question est: que vous achète-t-il? Vous n'avez probablement pas besoin de la portabilité extrême proposée par C, et il est dommage d'abandonner toutes les fonctionnalités offertes par C ++, à moins que vous ne vous y opposiez vraiment.
Meilleur temps de compilation?
Je pense que c'est surtout un choix esthétique. Beaucoup de gens aiment C parce que c'est simple et minimal et qu'il se sent propre. Le C ++ a beaucoup de fonctionnalités intéressantes (les espaces de noms le rendent intéressant à utiliser), mais il est également volumineux et désordonné.
la source
#define malloc(x) my_malloc(x)
#define free(x) my_free(x)
et vous êtes en train de déboguer la mémoire. Avec C ++, vous ne savez jamais ce qui sera alloué quand, car il y a tant de façons d'allouer de la mémoire (new, constructeurs de classe, malloc, classe, etc.)J'ai beaucoup travaillé avec un moteur de jeu en pur-C qui a livré plusieurs produits, c'est donc tout à fait possible. Voici mon expérience personnelle de travail dans les deux moteurs C vs C ++:
Tous ces avantages pourraient également être obtenus tout aussi facilement en utilisant du code restreint c ++ qui évite d'utiliser des modèles et l'héritage sur des objets sérialisés, mais le CTO a décidé qu'il serait plus facile d'appliquer la simplicité si les éléments les plus confus du C ++ n'étaient pas gênants. disponible.
Personnellement, je pense que c’était un peu extrême, car j’ai vraiment manqué la possibilité de déclarer de manière saine les variables dans les boucles for et les nombreuses utilisations tout à fait légitimes de la succession. Mais cela ne nous a vraiment pas coûté beaucoup de productivité à la fin, tout compte fait
la source
memcpy
pour rien, car le système de types n’autorise pas les choses telles que les copieurs et les dépositaires. Je peux écrire du code en sachant que je n'aurai pas à annuler les effets secondaires sur presque n'importe quelle ligne de code, car je ne peux pas implicitement quitter une fonction à moins d'en sortir explicitement. il n'y a pas d'exception à lancer. Tout cela facilite grandement l’écriture de structures de données: en C ++, écrire une application conforme à la normevector
prend beaucoup de temps, surtout si vous voulez le rendre ...Je suis en train de réécrire un moteur de jeu 2D écrit en C ++ et Lua en C et Lua. Jusqu'à présent, l'expérience a été plutôt bonne. Évidemment, les opérations sur les vecteurs et les matrices ne sont pas aussi agréables en C. Mais à part cela, j'ai trouvé l'expérience très rafraîchissante après avoir passé plus de 10 ans en tant que développeur C ++.
C présente de nombreux avantages par rapport au C ++:
En dehors de cela, il y a un certain nombre d'avantages à entrer dans la façon de penser de C. En C ++, je suis souvent en train de rendre les choses un peu trop générales et abstraites. Dans CI, supprimez généralement des méthodes telles que get-set et préallouez souvent des tableaux de taille fixe plutôt que d’utiliser des tableaux dynamiques. Souvent, je me retrouve avec un code plus court et plus facilement débogué en C. Les structures de données sont généralement plus plates et plus faciles à visualiser dans un débogueur.
Pour être juste, je ne ferais jamais une application exclusivement en C. La raison pour laquelle cela fonctionne c'est que je la combine avec un langage de niveau supérieur comme Lua, qui peut très bien compléter le C si C n'est pas si fort.
Le logiciel Id écrit la plupart de leurs moteurs dans CI, vous pouvez regarder Return to castle Wolfenstein qui a été écrit en C.
J'ai écrit sur une partie de mon expérience concernant l' évolutivité de C vs C ++ et les inconvénients du vecteur STL par rapport aux tableaux ordinaires.
la source
Comme quelqu'un l'a fait remarquer, le C ++ apporte l'avantage des larges épaules sur lesquelles vous pouvez vous appuyer (BOOST, STL, etc.). En fin de compte, c'est un choix personnel, mais je choisirais le C ++ en raison des ressources disponibles. Si vous ne souhaitez pas utiliser certaines fonctionnalités de C ++, ne les utilisez pas.
la source
Je ne pense pas que quiconque utilise le C exclusivement ces jours-ci, il est généralement mélangé avec un langage de niveau supérieur.
La programmation en C présente certains avantages par rapport à la programmation en C ++. C ++ peut faire beaucoup de choses invisibles pour l'utilisateur, ce qui peut nuire aux performances si vous ne faites pas attention. C ++ peut aussi être terrible en ce qui concerne l'utilisation du cache, ce qui peut encore nuire à vos performances.
Il peut donc être avantageux d’écrire les parties critiques du jeu d’un point de vue du C, plutôt que du C ++ traditionnel. Je n'ai jamais entendu parler de personne, ces dernières années, écrivant un jeu entier en C cependant.
Sur certaines plates-formes, comme l'iPhone, l'utilisation de C ++ peut augmenter la taille de votre exécutable avec une certaine quantité de kilo-octets (j'ai oublié combien, désolé), ce qui explique pourquoi certains développeurs iPhone choisissent d'écrire leur code dans un mélange de C et Objective. -C.
la source
Je vais vous donner deux autres raisons pour lesquelles il serait déraisonnable d'écrire un moteur de jeu en C au lieu de C ++ aujourd'hui: STL et BOOST.
Je ne peux pas imaginer à quel point il serait utile d'écrire une autre
list
implémentation lorsque vous pouvez utiliser un code qui fonctionne immédiatement (et que vous n'avez pas à écrire!)la source
Ecrire un moteur de jeu en C est raisonnable. C'est rapide et peut être porté sur plusieurs systèmes. Par exemple, vous pouvez utiliser pour Android (avec l’utilisation du NDK). Vous pouvez l'utiliser pour l'iPhone (Objective c n'est qu'une extension de c). Vous pouvez également l'utiliser pour et des systèmes d'exploitation principaux tels que Linux, Mac ou Windows. Si vous vous sentez à l'aise avec c, je vous suggère de l'essayer!
la source
Bien sûr que c'est raisonnable. Personnellement, je ne le ferais pas, et la plupart des fans de C que je connais ne font qu’écrire du code de type C dans des fichiers .cpp. Mais les langues sont assez similaires à l'endroit où cela n'a pas d'importance.
En ce qui concerne la raison pour laquelle quelqu'un choisirait de faire cela, je pense que c'est principalement dû à la philosophie anti-C ++. Personnellement, je ne pense toujours pas que ce soit une bonne raison de choisir C plutôt que "C-style C ++". La folie typedef struct est une raison suffisante pour éviter C, et il en existe plusieurs autres.
Malheureusement, le C et le C ++ sont des langages assez terribles quand on y arrive. C'est une des raisons pour lesquelles les gens ont essayé de faire beaucoup de leur code dans un script ces dernières années.
Si vous recherchez des exemples de personnes travaillant en C, vous pouvez ignorer id. Je me souviens d'avoir lu qu'elles avaient abandonné C depuis longtemps. Cryptic Studios (Star Trek Online) fait tout son développement moteur en C, cependant. Autant que je sache, oui, c'est davantage à cause de la philosophie que de tout avantage tangible.
la source
Oui et non. Oui, je l’ai fait il ya quelques années, mais j’avais besoin que mon jeu fonctionne en 3D sur un serveur distant 64 bits unix (et non pas Linux) avec les lecteurs sur des terminaux muets. C'était non trivial. C peut être sympa si vous voulez intégrer LUA, mais j’ai finalement eu à travailler avec C ++, alors je dirais que c’est possible, mais ne le faites pas.
la source
Une bonne réponse possible pourrait-elle être "utiliser les deux"?
Lorsque j'ai entendu dire que les projets panda3d pourraient être optimisés, éliminer les goulets d'étranglement en utilisant du cython ou en recodant ces parties.
La plupart du temps, les parties qui doivent être optimisées sont celles qui comportent de nombreuses itérations et imbrications ou beaucoup d’informatique numérique. Je suppose donc que le meilleur choix est qu’un compromis raisonnable consisterait à utiliser les deux langages, en utilisant C pour les parties qui incluent beaucoup de programmation de bas niveau, vous ne pouvez donc pas utiliser abusivement le langage C ++ pour la partie qui nécessite de la vitesse, et le C ++ pour le reste du jeu.
Idéalement, vous faites la partie rapide du moteur en gardant à l’esprit le niveau élevé, puis vous utilisez un langage de script ou C ++ qui utilise beaucoup moins de boucles imbriquées / nid.
Bien sûr, vous ne pourriez jamais créer un tel moteur qui conviendrait à tous les développeurs de jeux, sauf si vous dédiez votre moteur à un type de jeu spécial ...
Mais ne prenez pas mes conseils pour acquis, car je ne suis ni développeur de jeux ni expérimenté ... Je pense que C vous oblige à écrire du code rapide, tout en écrivant du code C ++ bon et rapide pour un projet aussi gros qu'un jeu est une chose différente ...
la source
C a travaillé pour John Carmack , l’utilisation de C pourrait vous procurer de nombreux avantages, mais tant que vous n’y arriverez pas pour en tirer parti, il vous faudra peut-être un peu de temps.
Vous trouverez ici une liste de moteurs de jeu. Certains d’entre eux sont écrits en C, vous pouvez peut-être vous expliquer comment utiliser un moteur de jeu C en consultant leur code source.
la source
Le code C est normalement un code C ++ valide.
Les principaux problèmes avec C ++ l'utilisent de manière incorrecte ( Linus Torvalds le déteste pour cette raison , il avait également d'autres problèmes avec la portabilité des bibliothèques et, par conséquent, il travaille au niveau des systèmes d'exploitation et doit pouvoir exécuter des tâches de manière aléatoire. chip out là-bas).
Par exemple, l'utilisation d'un tableau cstyle [] par rapport à un c ++ std :: vector <> (ou un conteneur similaire) ne présente presque aucun avantage.
Les vecteurs sont typés et peuvent être vérifiés (vous pouvez accéder aux éléments avec get () ou [], même si vous n'utilisez pas la méthode array check, vous pouvez toujours interroger la taille plutôt que de la transporter avec le pointeur).
Mais les vecteurs peuvent être plus lents si, par exemple, vous ne déclarez pas la taille par défaut dans le constructeur. De plus, l'ajout d'éléments à un vecteur peut provoquer des ralentissements s'il nécessite un redimensionnement. C ++ 11 ajoute également de nombreux avantages, tels que l'initialisation uniforme (vous pouvez maintenant déclarer et initialiser des vecteurs en utilisant la même syntaxe) et certains constructeurs de déplacement peuvent vous permettre d'éviter la copie. Vous pouvez même créer vos propres initialiseurs personnalisés (si vous vouliez faire autre chose que d’utiliser malloc pour une raison quelconque).
Bien sûr, si vous avez besoin de redimensionner des éléments, les vecteurs sont toujours plus faciles à utiliser, vous n'avez pas à vous soucier de malloc, de copier manuellement des éléments, etc.
C ++ vous donne un code orienté objet. Une fois compilé, il sera tout aussi efficace car il s’agit en réalité d’une simple abstraction pour les utilisateurs du code. Bien que des choses comme les constructeurs puissent ralentir la création d’objets. Mais vous aurez besoin soit du constructeur pour définir les valeurs par défaut, soit vous pouvez initialiser des objets sans utiliser le constructeur (en laissant de côté les ()).
Mais l'orientation des objets facilite beaucoup la programmation des jeux . Les jeux traitent souvent d'objets.
la source