27 votes

C ++ pour la programmation de jeux - Amour ou méfiance?

Au nom de l'efficacité dans la programmation de jeux vidéo, certains programmeurs ne font pas confiance à plusieurs fonctionnalités C++. Un de mes amis prétend comprendre comment le jeu fonctionne l'industrie, et serait venu, avec les remarques suivantes:

  • Ne pas utiliser des pointeurs intelligents. Personne dans les jeux.
  • Les Exceptions ne devraient pas être (et n'est généralement pas) utilisé en programmation de jeu de la mémoire et de la vitesse.

Combien de ces déclarations sont vraies? Des fonctionnalités C++ ont été conçus en gardant l'efficacité à l'esprit. C'est que l'efficacité ne suffit pas pour la programmation de jeu? Pour 97% de la programmation de jeux vidéo?

Le C-façon-de-la pensée semble encore avoir une bonne connaissance sur le jeu de la communauté de développement. Est-ce vrai?

J'ai regardé une autre vidéo d'une conférence sur la multi-programmation de base à la GDC 2009. Son discours a été presque exclusivement orientée vers la Cellule de Programmation, où de transfert DMA est nécessaire avant le traitement (simple pointeur d'accès ne fonctionne pas avec la SPE de la Cellule). Il déconseille l'utilisation de polymorphisme que le pointeur doit être "re-based" pour le transfert DMA. Quelle triste. C'est comme revenir à la case départ. Je ne sais pas si il existe une solution élégante pour programmer en C++ polymorphisme sur la Cellule. Le sujet du transfert DMA est ésotérique et je n'ai pas beaucoup de fond ici.

Je suis d'accord que le C++ n'a pas été très agréable pour les programmeurs qui veulent une petite langue de hack avec, et ne pas lire des piles de livres. Des modèles ont également effrayé l'enfer hors de débogage. Êtes-vous d'accord que le C++ est trop redouté par la communauté des joueurs?

63voto

Skizz Points 30682

Le dernier jeu que j'ai travaillé sur était Heavenly Sword sur PS3 et qui a été écrit en C++, même la cellule de code. Avant cela, j'ai fait quelques jeux PS2 et PC jeux et ils ont été C++. Non des projets ont utilisé des pointeurs intelligents. Non pas à cause de problèmes d'efficacité, mais parce qu'ils n'étaient généralement pas nécessaire. Jeux, surtout les jeux de la console, ne faites pas l'allocation de mémoire dynamique à l'aide de la norme gestionnaires de mémoire pendant la lecture normale. Si il y a des objets dynamiques (missiles, ennemis, etc) alors qu'ils sont généralement pré-alloués et ré-utilisé comme nécessaire. Chaque type d'objet aurait une limite supérieure sur le nombre de cas, le jeu peut se débrouiller avec. Ces plafonds seraient définis par la quantité de traitement nécessaire (trop nombreux et le jeu ralentit énormément) ou de la quantité de RAM présente (trop et vous pourriez commencer fréquemment la pagination sur disque, ce qui permettrait de dégrader sérieusement les performances).

Les jeux sont en général de ne pas utiliser des exceptions, parce que bon, les jeux ne devraient pas avoir des bugs et donc de ne pas être capable de générer des exceptions. Cela est particulièrement vrai de la console de jeux où les jeux sont testés par le fabricant de la console, bien que les plates-formes récentes comme la 360 et la PS3 ne semble y avoir quelques jeux qui peuvent tomber en panne. Pour être honnête, je n'ai pas lu quelque chose à propos de ce que le coût réel d'avoir des exceptions est activé. Si le coût est engagée que lorsqu'une exception est levée alors il n'y a aucune raison de ne pas les utiliser dans les jeux, mais je ne sais pas pour vous, et c'est probablement dépend du compilateur utilisé. En général, les programmeurs de jeux savoir quand peut y avoir des problèmes qui seront traités à l'aide d'une exception dans une application d'entreprise (comme des IO et l'initialisation) et de les manipuler sans l'utilisation des exceptions (c'est possible!).

Mais alors, à l'échelle mondiale, le C++ est de diminuer lentement comme un langage pour le développement de jeux. Flash et Java probablement avoir une bien plus grande tranche de marché et ils ont des exceptions et des pointeurs intelligents (sous la forme d'objets gérés).

Comme pour le pointeur de Cellule accès, les problèmes surviennent lorsque le code est DMA avais dans la Cellule à l'arbitraire des adresses de base. Dans ce cas, tous les pointeurs dans le code besoin d'être "réparé" avec la nouvelle adresse de base, cela inclut v-tables, et vous ne voulez pas vraiment faire cela pour chaque objet que vous chargez dans la Cellule. Si le code est toujours chargé à une adresse fixe, il n'est jamais nécessaire de corriger les pointeurs. Vous perdez un peu de souplesse mais comme vous êtes à la limite de code peuvent être stockés. Sur un PC, le code ne se déplace jamais en cours d'exécution afin de pointeur fix-up au moment de l'exécution n'est jamais nécessaire.

Je ne pense vraiment pas que quelqu'un "se méfie" C++ dispose d' - ne pas avoir confiance dans le compilateur est quelque chose de complètement différent et très souvent les de nouveaux, ésotérique architectures, telles que les Cellules ont tendance à obtenir robuste compilateurs C avant le C++, car un compilateur C est beaucoup plus facile à faire qu'un C++.

57voto

Charlie Martin Points 62306

Regardez, la plupart tout ce que vous entendez quelqu'un dire sur l'efficacité de la programmation est de la pensée magique et de la superstition. Pointeurs intelligents ont un coût, surtout si vous faites beaucoup de fantaisie pointeur de manipulations dans une boucle interne, il pourrait faire une différence.

Peut-être.

Mais quand les gens disent des choses comme ça, c'est généralement le résultat de quelqu'un qui leur a dit il y a longtemps que X est vrai, sans rien, mais l'intuition derrière elle. Maintenant, la Cellule/polymorphisme émettre des sons plausible - et je parie qu'il a fait pour le premier mec qui l'a dit. Mais je n'ai pas vérifié.

Vous allez entendre les mêmes choses, a déclaré le C++ pour les systèmes d'exploitation: que c'est trop lent, qu'il fait des choses que vous voulez faire bien mal.

Néanmoins, nous avons construit OS/400 (à partir de v3r6 avant) entièrement en C++, nu sur place, et a obtenu une base de code qui a été rapide, efficace, et de la petite. Il a fallu un peu de travail; travail du métal nu, il y a quelques problèmes d'amorçage, l'utilisation du placement de nouvelles, ce genre de chose.

C++ peut être un problème tout simplement parce que c'est trop gros: je suis à la relecture de Stroustrup wristbreaker droit maintenant, et c'est assez intimidant. Mais je ne pense pas qu'il y ait quelque chose d'inhérent qui dit que vous ne pouvez pas utiliser C++ de manière efficace dans le jeu de programmation.

12voto

Dan Points 4107

Si vous ou votre ami êtes vraiment paranoïaque à propos de la performance, alors allez lire les manuels Intel sur l'optimisation. Amusant.

Sinon, aller de l'exactitude, de la fiabilité et de la maintenabilité à chaque fois. Je préfère avoir un jeu qui a couru un peu lentement que celui qui s'est écrasé. Si/quand vous remarquez que vous avez des problèmes de performance, PROFIL et de l'optimiser. Vous trouverez probablement que les theres quelques hotspot morceau de code qui peut être rendue plus efficace par l'utilisation plus efficace des données de la structure ou de l'algorithme. Ne vous embêtez pas à propos de ces stupides peu mico-optimisation lors de l'analyse montre qu'ils sont la seule façon vous pouvez obtenir un bon speedup.

Donc:

  1. Écrire du code pour être clair et correct
  2. Profil
  3. PROFIL
  4. Pouvez-vous utiliser plus efficaces les structures de données et algorithmes pour accélérer le goulot d'étranglement?
  5. L'utilisation de micro-optimisations comme un dernier recours et seulement quand le profilage a montré qu'il aiderait

PS: beaucoup de modernes compilateurs C++ prévoir une exception d'un mécanisme de gestion qui ajoute à zéro exécution des généraux, SAUF si une exception est levée. Qui est, la performance est réduite lorsqu'une exception est levée. Aussi longtemps que les exceptions ne sont utilisées que dans des circonstances exceptionnelles, puis theres aucune bonne raison de ne pas les utiliser.

6voto

Adam Jaskiewicz Points 7485

Beaucoup de gens prennent absolue déclarations au sujet de choses, parce qu'ils n'ont pas réellement penser. Ils seraient plutôt juste appliquer une règle, de rendre les choses plus fastidieux, mais nécessitant moins de la conception et de prévoyance. Je préfère avoir un peu de mal à réfléchir maintenant et puis, quand je suis en train de faire quelque chose de poilu, et abstraction de l'ennui, mais je ne crois pas, tout le monde pense de cette façon. Bien sûr, pointeurs intelligents ont un coût de performance. Afin de faire des exceptions. Cela veut simplement dire que il y a peut être quelques petites parties de votre code où vous ne devriez pas les utiliser. Mais vous devriez profil d'abord et assurez-vous que c'est réellement ce qu'est le problème.

Avertissement: je n'ai jamais fait un jeu de programmation.

5voto

Adam Rosenfield Points 176408

Concernant la Cellule architecture: il a un incohérente cache. Chaque SPE a son propre magasin local de 256 KO. Les structures d'accueil ne peut accéder à cette mémoire; toute autre mémoire, tels que les 512 MO de mémoire vive ou le magasin local d'une autre SPE, doit être consulté avec le DMA. Vous effectuez le DMA manuellement et copie de la mémoire dans votre magasin local explicitement à initier un transfert DMA. Cela fait de la synchronisation d'une immense douleur.

Alternativement, vous pouvez accéder à d'autres de la mémoire. La mémoire principale et chaque SPE magasin local est associé à une certaine section de la version 64 bits de l'espace d'adressage virtuel. Si vous avez accès à des données par le droit de pointeurs, le DMA qui se passe en coulisses, et tout cela ressemble à un géant de l'espace mémoire partagé. Le problème? Énorme gain de performance. Chaque fois que vous accédez à l'un de ces indicateurs, le SPE stands alors que le DMA se produit. C'est lent, et il n'est pas quelque chose que vous voulez faire dans la performance est critique de code (c'est à dire un jeu).

Cela nous amène à Skizz point sur les vtables et pointeur de corrections. Si vous êtes copier aveuglément autour de vtable des pointeurs entre les structures d'accueil, vous allez subir un énorme gain de performance si vous n'avez pas de réparer votre pointeurs, et vous allez également subir un énorme gain de performance si vous faites réparer votre pointeurs et télécharger le virtuel code de fonction de la structure d'accueil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X