Est-il raisonnable décrire un moteur de jeu en C? [fermé]

Fermé . Cette question est basée sur une opinion . Il naccepte pas les réponses actuellement.

Commentaires

  • Les jeux console utilisent c ++ FYI!
  • Je pense en fait que C serait plus facile décrire des jeux jusquà une certaine échelle, disons des dizaines de milliers de LOC ou plus, principalement parce quil vous permet de vous concentrer uniquement sur les bits et les octets sans types de données complexes et quil se construit très rapidement par rapport au C ++. Mais après une certaine échelle (par exemple, atteindre des centaines de milliers de LOC), je ' commencer à vouloir atteindre le C ++ où je ' d commencez à vouloir des types de données complexes, plus de sécurité de type, éventuellement des exceptions, des modèles, et une échelle encore plus grande (disons des millions), pour que des choses autres que C ++ se combinent avec le code C et C ++.
  • C a également lavantage supplémentaire dêtre largement portable même pour ABI, il devient donc assez facile de prendre votre code C existant et de commencer à lutiliser dans dautres langues à partir, par exemple, dun FFI. Le C ++ est un peu plus gênant avec la modification des noms, lincapacité à franchir en toute sécurité les limites des modules, les représentants de vtable ne sont pas les mêmes dun compilateur à lautre, les implémentations de bibliothèques standard différant dun fournisseur à lautre, etc. se démode, même si cela prend plus de temps pour écrire quoi que ce soit déchelle.

Réponse

Cependant, est-ce que lécriture dun moteur de jeu entier en C serait déraisonnable aujourdhui?

Cest raisonnable, mais le la question est de savoir ce que cela vous achète? Vous navez probablement pas besoin de lextrême portabilité quoffre C, et cest dommage dabandonner toutes les fonctionnalités offertes par C ++ à moins que vous ne soyez vraiment philosophiquement opposé à cela.

Quels sont, le cas échéant, certains avantages du C par rapport au C ++?

Meilleur temps de compilation?

Pourquoi quelquun pos voulez-vous vraiment utiliser C plutôt que C ++?

Je pense que cest principalement un choix esthétique. Beaucoup de gens aiment C parce quil est simple et minimal et se sent propre. C ++ a beaucoup de fonctionnalités intéressantes (les espaces de noms seuls en valent la peine), mais il est aussi gros et désordonné.

Commentaires

  • Jusquà Id Tech 4
  • @Josh: plus facile à déboguer !? Les programmes C sont notoirement difficiles à déboguer, en grande partie à cause des pointeurs et de la gestion de la mémoire. Les programmes C ++ (lorsque vous utilisez de vrais idiomes de programmation C ++, qui ont tendance à éviter les pointeurs et la gestion de la mémoire chaque fois que possible) sont plusieurs ordres de grandeur plus faciles à déboguer.
  • C peut être compris par de simples mortels. C ++ semble avoir beaucoup de fonctionnalités et de cas extrêmes que les programmeurs chevronnés apprennent même après une décennie dutilisation quotidienne pour la vie.
  • C ++ est un grand langage, mais il ' est principalement répandue par des personnes qui ' ont juste lu des histoires dhorreur et nont ' pas pris le temps de lapprendre . Il y a beaucoup à apprendre, mais vous obtenez beaucoup de valeur en retour. C ++ vous permet dexprimer beaucoup de choses que C peut simplement ' t.
  • @ BlueRaja-DannyPflughoeft #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 tellement de façons dallouer de la mémoire (new, malloc, constructeurs de classe, etc.)

Réponse

Jai beaucoup travaillé avec un moteur de jeu pur-C qui a livré plusieurs produits, cest donc tout à fait possible. Voici mon expérience personnelle de travail dans les deux moteurs C vs C ++:

  1. Lutilisation de structures pur-C vous permet de tirer parti des connaissances sur lalignement des structures, et vous pouvez ensuite utiliser ces informations pour créer vos couches de persistance et de sérialisation des objets. Le moteur avec lequel jai travaillé avait quelques analyseurs den-tête simples qui créeraient automatiquement ces métadonnées sur les structures, et cela rendait certains types dopérations de données triviaux. Lanalyse de fichiers den-tête C ++ arbitraires est pratiquement impossible, et dès au fur et à mesure que vous ajoutez lhéritage et les fonctions virtuelles, vous perdez la possibilité de savoir exactement où les choses sont en mémoire
  2. Le temps de compilation est beaucoup plus court car vous pouvez garder vos fichiers den-tête très compacts et tirer parti des déclarations de structures.
  3. Le débogage peut être amélioré car sans l utilisation de modèles et d héritage, il est très facile de comprendre exactement ce quest un certain objet et ce quil fait.

Tous ces avantages pourraient également être obtenus tout aussi facilement en utilisant du code C ++ restreint qui sabstient dutiliser des modèles et de lhéritage sur des objets sérialisés, mais le CTO a décidé que ce serait plus facile pour renforcer la simplicité si les éléments les plus déroutants de C ++ nétaient pas disponibles.

Personnellement, je pense que cétait légèrement extrême, car jai vraiment manqué la possibilité de déclarer correctement les variables dans les boucles for et les nombreuses utilisations tout à fait légitimes de lhéritage. Mais, cela ne nous a pas vraiment coûté beaucoup de productivité à la fin tout bien considéré

Commentaires

  • Là ' nest vraiment rien qui vous empêche dimplémenter lhéritage en C. Et si vous utilisez C99, vous pouvez déclarer des variables dans des boucles for.
  • Je ne suis pas daccord avec le point 3. ' est tout aussi facile à écrire du code compliqué et difficile à déboguer en C quen C ++. Un meilleur débogage nest pas ' quelque chose dinhérent au langage C.
  • Même un code propre peut être plus difficile à comprendre en C ++ – avec surcharge, modèles, fonctions virtuelles et exceptions, il ' est beaucoup plus difficile de voir dun coup dœil exactement ce que sera le flux de contrôle réel.
  • @Dan: Simplement en ayant plus de choses, C ++ est plus difficile à déboguer. Vous pouvez bien sûr vous empêcher dutiliser nimporte lequel de ces trucs, auquel cas cela devient aussi facile à déboguer que C – car cela devient C.
  • Moins de choses est en fait la raison pour laquelle jaime C. Par exemple, dans CI peut simplement copier des bits et des octets avec un memcpy pour nimporte quoi parce que le système de type ne permet ' t que de copier des ctors et des dtors . Je peux écrire du code en sachant que je nai pas ' à annuler les effets secondaires sur presque toutes les lignes de code, car je peux ' t implicitement quitter une fonction à moins que jen retourne explicitement; il ny a aucune exception lancée. Tout cela rend lécriture de structures de données tellement plus facile – en C ++, le simple fait décrire un vector conforme à la norme prend beaucoup de temps, surtout si vous voulez le faire …

Réponse

Je réécris un moteur de jeu 2D écrit en C ++ et Lua en C et Lua. Jusquà présent, lexpérience a été plutôt bonne. Évidemment, faire des opérations vectorielles et matricielles ne finit pas par être aussi beau en C. Mais à part cela, jai trouvé lexpérience assez rafraîchissante après avoir passé plus de 10 ans en tant que développeur C ++.

C a un certain nombre de avantages par rapport au C ++:

  1. Le compilateur sassurera quaucun code nest exécuté au moment de linitialisation statique. Cela rend totalement sûr lallocation statique de données globales comme des chaînes utilisées comme clés, par exemple
  2. Transparence. En affectation en C, lallocation ou la définition dune variable nentraînera pas lexécution de charges de code. C ++ générera automatiquement des constructeurs de copie pour vous afin que vous ayez moins de contrôle sur ce qui est exécuté lors de laffectation.
  3. Beaucoup de débogages peuvent être plus faciles car les noms de fonctions ne sont pas mutilés
  4. Cest généralement correct dutiliser memcpy en C, mais cela causera facilement des problèmes en C ++, car les constructeurs de copie ne seront pas exécutés. tha t memcpy est beaucoup plus rapide que std :: copy qui compte.

En dehors de cela, il y a un certain nombre davantages à entrer dans la façon de penser C. En C ++, je me retrouve souvent à faire des choses un peu trop généralisées et abstraites. En C, je supprime généralement des choses comme les méthodes get-set et je préalloue souvent des tableaux de taille fixe plutôt que dutiliser des tableaux dynamiques. Souvent, je me retrouve avec un code plus court et plus facile à déboguer en C. Les structures de données sont généralement plus plates et plus faciles à visualiser dans un débogueur.

Pour être honnête, je ne ferais jamais une application exclusivement en C. La raison ça marche que je le combine avec un langage de niveau supérieur comme Lua qui peut très bien compléter C, si C nest pas si fort.

Le logiciel Id écrit la plupart de leurs moteurs en CI crois, vous pouvez regarder Retournez au château Wolfenstein qui a été écrit en C.

Jai écrit une partie de mon expérience sur évolutivité de C vs C ++ et inconvénients du vecteur STL par rapport aux tableaux simples.

Commentaires

  • FYI, dans chaque cas que jai ' vérifié (ce qui est, je pense, darwin gcc et vc2008), std :: copy sera compilez simplement vers un appel à memcpy si les deux types sont POD.
  • Aussi, RE: STL vector vs plain arrays, pourquoi ne pas utiliser les belles parties de vecto r et utiliser des pointeurs C normaux au lieu des itérateurs si vous ne les aimez pas '? Vous pouvez simplement faire & myvector [N].Il ' est comme le meilleur des deux mondes, en supposant que votre code C effectue lallocation de mémoire de la même manière. Ou, dans les boucles for, consultez BOOST_FOREACH. Rend les choses encore plus simples que C.
  • Merci pour le conseil sur std :: copy memcpy. Je ne ' pas le savoir. Lorsque Alexandrescu a traité cela il y a quelques années, ce nétait pas le cas. À propos des itérateurs C ++. Il sagit principalement de la philosophie, jessaie de programmer comment C ++ était censé être programme à la fois pour le bien des personnes avec lesquelles je travaille et pour tirer parti des fonctionnalités C ++. Il a été principalement fait pour souligner que certaines améliorations C ++ comme les conteneurs STL ne sont pas toujours meilleures que de le faire à lancienne manière C.

Réponse

Comme quelquun dautre la fait remarquer, C ++ apporte lavantage de grandes épaules sur lesquelles vous pouvez vous tenir (BOOST, STL etc.). En fin de compte, cest un choix personnel, mais je choisirais C ++ en raison des ressources disponibles. Sil y a des fonctionnalités en C ++ que vous ne souhaitez pas utiliser, alors ne les utilisez pas.

Commentaires

  • Notez que 99% des les moteurs de jeux commerciaux et internes séloignent de Boost et de STL pour diverses raisons (garantie de performances, débogage, sécurité des threads, contrôle).
  • Et 99% des statistiques sont constituées.
  • Je pense quil devrait être un peu une règle de citer toutes les statistiques.

Réponse

Je ne le fais pas  » Je pense que quiconque utilise exclusivement C ces jours-ci, il est généralement mélangé avec un langage de niveau supérieur.

La programmation en C a quelques avantages par rapport, par exemple, à la programmation en C ++. C ++ peut faire beaucoup de choses sous le capot qui sont invisibles pour lutilisateur, ce qui peut nuire aux performances si vous ne faites pas attention. C ++ peut aussi être terrible en ce qui concerne lutilisation du cache, ce qui peut à nouveau nuire à vos performances.

Il peut donc être avantageux décrire les parties essentielles aux performances dun jeu de manière C-like, plutôt que de manière C ++ traditionnelle. Jamais entendu parler de personne, ces dernières années, en train décrire un jeu entier en C cependant.

Sur certaines plates-formes, comme liPhone, lutilisation de C ++ peut augmenter la taille de votre exécutable dun certain nombre de kilo-octets (jai oublié comment beaucoup, désolé), raison pour laquelle certains développeurs iPhone choisissent décrire leur code dans un mélange de C et dObjective-C.

Réponse

Je vais vous donner quelques autres raisons pour lesquelles il serait déraisonnable décrire un moteur de jeu en C au lieu de C ++ aujourdhui: STL et BOOST.

Je ne peux pas imaginer comment cela se passerait vaut la peine d’écrire un autre list impleme ntation lorsque vous pouvez compter sur un code qui fonctionne hors de la boîte (et que vous n’avez pas à écrire!)

Commentaires

  • gros studio utilise réellement boost? Même lutilisation de STL est toujours en débat, en raison de la portabilité. Au moins pour les moteurs de console.
  • Personnellement, je ' utilise Boost.FunctionTypes pour linteraction c ++ / lua (voir gamedev.net/reference/programming/features/CPPLuaExport/ … ) et la bibliothèque de nombres aléatoires Boost pour la génération de nombres aléatoires uniformes (pour les systèmes de particules). Aussi, Boost.Foreach est chouette. BTW, qui se soucie si les grands studios nutilisent pas BOOST? Ils ont la main-d’œuvre nécessaire pour écrire leurs propres bibliothèques STL à partir de rien, je ne ' t.
  • Ouais, mais je me rends également compte qu’il existe ' pour C.
  • Beaucoup de gens utilisent boost dans les jeux, je crois. Mais ce ' est loin dêtre une exigence (ou même souhaitable) pour beaucoup dentre nous.
  • Les gens, ce que vous pensez est sans importance : soit vous savez , soit vous ne ' ne savez pas .

Réponse

Ecrire un moteur de jeu en C est raisonnable. Il est rapide et peut être porté sur plusieurs systèmes. Par exemple, vous pouvez lutiliser pour Android (avec lutilisation du NDK). Vous pouvez lutiliser pour liPhone (Objective c est juste une extension de c). Vous pouvez également utiliser il pour et des OS principaux tels que Linux, Mac ou Windows. Si vous vous sentez à laise avec c, je vous suggère de lessayer!

Réponse

Bien sûr, cest raisonnable. Personnellement, je ne le ferais pas, et la plupart des fans de C que je connais écrivent simplement du code de type C dans des fichiers .cpp. Mais les langages sont assez similaires là où cela na pas vraiment dimportance.

Quant à savoir pourquoi quelquun choisirait de faire cela, je pense que cest 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 le C, et il y en a un certain nombre dautres.

Malheureusement, C et C ++ sont tous deux des langages assez terribles quand on y passe. Cest lune des raisons pour lesquelles les gens ont essayé de faire beaucoup de leur code en script ces dernières années.

Si vous « cherchez des exemples de personnes travaillant en C, vous pouvez ignorer id car je me souviens avoir lu quils » ont abandonné C il y a longtemps. Cependant, Cryptic Studios (Star Trek Online) fait tout son développement de moteur en C. Pour autant que je sache, oui, cest plus à cause de la philosophie quà cause dun avantage tangible.

Réponse

Oui et non. Oui, je lai fait il y a quelques années mais javais besoin que mon jeu tourne en 3D sur un serveur distant 64 bits unix (pas Linux) avec les joueurs sur des terminaux stupides. Ce nétait pas trivial. C peut être sympa est vous voulez intégrer LUA mais jai finalement réussi à faire fonctionner lua en C ++ donc je dirais que oui cest possible mais ne le faites pas.

Réponse

Une bonne réponse pourrait-elle être » utiliser les deux « ?

Comme jai entendu dire que les projets panda3d pourraient être optimisés, éliminant les goulots détranglement en utilisant un cython ou en recodant ces parties.

La plupart du temps, les parties qui doivent être optimisées sont celles avec beaucoup ditérations et dimbrication ou avec beaucoup de calcul numérique, donc ma supposition (sauvage) est quun bon compromis serait dutiliser les deux langues , en utilisant C pour les parties qui incluent beaucoup de programmation de bas niveau, donc vous ne pouvez pas faire un y une mauvaise utilisation du langage C ++ pour la partie qui a besoin de vitesse, et C ++ pour le reste du jeu.

Idéalement, vous faites la partie rapide du moteur en gardant à lesprit le haut niveau, puis utilisez un langage de script ou C ++ qui utilisera beaucoup moins de nest / loops.

Bien sûr, vous ne pourriez jamais créer un tel moteur qui conviendrait à tous les jeux que les développeurs auraient besoin de faire, sauf si vous consacrez votre moteur à un genre de jeu …

Mais ne prenez pas mes conseils pour acquis puisque je ne suis pas un développeur de jeux expérimenté ni un développeur expérimenté … Je pense que C vous oblige à écrire du code rapide, tout en écrivant un code C ++ bon et rapide pour un projet aussi gros quun jeu est une autre chose …

Réponse

C a fonctionné pour John Carmack , vous pourriez obtenir de nombreux avantages en utilisant C, mais jusquà ce que vous y arriviez pour en profiter, cela pourrait vous prendre un certain temps.

Vous trouverez ici une liste de moteurs de jeu certains o Sils sont écrits en C, peut-être que vous pouvez obtenir des informations sur la façon de faire un moteur de jeu en C en parcourant leur code source.

Réponse

Le code C est normalement du code C ++ valide.

Les principaux problèmes avec C ++ sont de lutiliser incorrectement ( Linus Torvalds le déteste pour cette raison , il a également eu dautres problèmes avec la portabilité de la bibliothèque et ainsi de suite, il travaille au niveau des systèmes dexploitation et doit être capable dexécuter des choses sur chaque puce aléatoire).

Par exemple il ny a presque aucun avantage à utiliser un tableau cstyle [] sur un c ++ std :: vector <> (ou un conteneur similaire).

Les vecteurs sont sécurisés. et peuvent être vérifiées par les limites (vous pouvez accéder aux éléments en utilisant soit get (), soit [], même si vous nutilisez pas la méthode de tableau vérifié, vous pouvez toujours interroger la taille plutôt que de la déplacer 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. Lajout déléments à un vecteur peut également entraîner des ralentissements sil a ensuite besoin dun redimensionnement. C ++ 11 ajoute également de nombreux avantages tels que linitialisation uniforme (vous pouvez maintenant déclarer et initialiser des vecteurs en utilisant la même syntaxe) et il existe des constructeurs de déplacement qui 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 dutiliser malloc pour une raison quelconque).

Ou bien sûr, si vous avez besoin de redimensionner des choses, alors les vecteurs sont encore plus faciles à faire avec , vous n « avez pas à jouer avec malloc, copier manuellement les choses et ainsi de suite.

C ++ vous donne du code orienté objet. Une fois compilé, il sera tout aussi efficace car il est vraiment juste une abstraction pour les humains travaillant avec le code. Bien que des choses comme les constructeurs puissent ralentir la création dobjets. Mais vous aurez soit besoin du constructeur pour définir les valeurs par défaut, soit vous pouvez initialiser des objets sans utiliser le constructeur (en laissant les () « s ).

Mais lorientation objet rend la programmation de jeux beaucoup plus facile. Les jeux traitent souvent dobjets.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *