En quoi les jeux 3D sont-ils si efficaces? [fermé]


188

Il y a quelque chose que je n'ai jamais compris. Comment un grand jeu PC comme GTA IV peut-il utiliser 50% de mon processeur et fonctionner à 60 ips alors qu'une démo DX d'une théière rotative à 60 ips utilise 30%?


124
Je ne vois pas ce qui ne va pas avec cette question - il est parfaitement naturel d'être curieux de savoir comment d'autres développeurs ont accompli certaines choses. Nous devrions encourager ce genre de curiosité, pas la punir par des votes serrés.
John Feminella

2
@ user146780: qui a posé la question ... Les meilleurs programmeurs que j'ai rencontrés travaillaient en CGI. Des gourous de SGI, des personnes travaillant sur la paralélisation d'Adobe Photoshop, etc. Ici, les gens ne réalisent pas à quel point il est compliqué d'écrire un jeu moderne ni à quel point ces codeurs sont qualifiés. Si vous voulez une expérience humiliante, regardez ce que les Allemands de Cryotech ont fait avec le moteur Crysis. Il y a des vidéos sur Youtube. Vous ne le croirez tout simplement pas. Il ne s'agit pas seulement "d'utiliser des octrees". En règle générale, ces programmeurs sont simplement beaucoup plus qualifiés que les programmeurs moyens. Et vous pouvez parier que les codeurs GT4 sont très bons.
SyntaxeT3rr0r

2
vous avez gta4 fonctionnant à 60fps !? GW! gta4 est un point de vente qui fonctionne assez mal, j'ai entendu dire que Force est également déclenché. Je dirais qu'Euphoria est le coupable. Honnêtement, "l'utilisation du processeur" est une très mauvaise façon de comparer, il suffit de décapsuler la fréquence d'images et de voir lequel fonctionne le plus rapidement, c'est la bonne façon de le faire. aussi, rappelez-vous, ce "jeu compliqué" même s'il peut rendre beaucoup de choses, il n'y a toujours qu'un écran de choses, et s'il est rendu dans le bon ordre, vous pourriez vous retrouver avec presque la même quantité de pixels que votre démo "simple", et le travail des pixels est vraiment ce qui le tue.
mat

8
Vous avez besoin d'un profileur qui vous montre à quel point le GPU (Graphics Processing Unit) est utilisé. Je parie que GTA IV vous montre ~ 99% et la démo 3%.
0scar

Par expérience, environ 10% des programmeurs de jeux avec lesquels j'ai travaillé étaient bons, les autres étaient au mieux moyens. Certains étaient totalement incompétents.
Skizz du

Réponses:


69

En général, c'est parce que

  1. Les jeux sont optimaux quant à ce dont ils ont besoin pour le rendu, et
  2. Ils tirent un avantage particulier de votre matériel.

Par exemple, une optimisation simple que vous pouvez faire consiste à ne pas essayer de dessiner des choses qui ne peuvent pas être vues. Considérez une scène complexe comme un paysage urbain de Grand Theft Auto IV . Le moteur de rendu ne rend pas réellement tous les bâtiments et structures. Au lieu de cela, il ne rend que ce que la caméra peut voir. Si vous pouviez voler à l'arrière de ces mêmes bâtiments, face à la caméra d'origine, vous verriez une structure de coque évidée à moitié construite. Chaque point que la caméra ne peut pas voir n'est pas rendu - puisque vous ne pouvez pas le voir, il n'est pas nécessaire d'essayer de vous le montrer.

De plus, des instructions optimisées et des techniques spéciales existent lorsque vous développez sur un ensemble particulier de matériel, pour permettre des accélérations encore meilleures.

L'autre partie de votre question est de savoir pourquoi une démo utilise autant de CPU:

... alors qu'une démo DX d'une théière rotative à 60 ips utilise 30%?

Il est courant que les démos d'API graphiques (comme dxdemo) reviennent à ce qu'on appelle un moteur de rendu logiciel lorsque votre matériel ne prend pas en charge toutes les fonctionnalités nécessaires pour montrer un bel exemple. Ces caractéristiques peuvent inclure des éléments tels que les ombres, la réflexion, le lancer de rayons, la physique, et cetera.

Cela imite la fonction d'un périphérique matériel entièrement complet qui est peu susceptible d'exister, afin de montrer toutes les fonctionnalités de l'API. Mais comme le matériel n'existe pas réellement, il fonctionne à la place sur votre CPU. C'est beaucoup plus inefficace que de déléguer à une carte graphique - d'où votre utilisation élevée du processeur.


3
Une démo DX utilise également votre matériel. Alors, qu'est-ce qui est «spécial»?
tur1ng

3
mais il est peu probable qu'une démo soit optimale à ce sujet.
µBio

2
@ tur1ng, la démonstration de la théière, par exemple, peut avoir activé la réflexion , les ombres et d'autres effets.
Nick Dandoulakis

2
La théière peut avoir plus de polygones qu'une scène GTA4. Le fait est que le goulot d'étranglement actuel dans le rendu graphique est davantage les effets de texture comme les techniques dérivées du bump mapping pour ajouter des détails et d'autres effets de post-rendu.
Klaim

5
Textures - la théière est créée à partir d'un grand nombre de triangles individuels, tous avec des normales et des interactions d'éclairage. Ce qui ressemble à un monde 3D incroyablement complexe dans le jeu est souvent de gros blocs assez simples recouverts d'une image détaillée. Une grande partie du `` 3d '' est constitué d'effets artistiques d'ombre et de perspective intelligents dans une image 2D statique dessinée sur la forme 3D
Martin Beckett

96

Patience, compétence technique et endurance.

Le premier point est qu'une démo DX est avant tout un outil pédagogique, donc c'est fait pour plus de clarté et non pour la rapidité d'exécution.

C'est un sujet assez important à condenser, mais le développement de jeux consiste principalement à comprendre vos données et vos chemins d'exécution à un degré presque pathologique.

  1. Votre code est conçu autour de deux choses: vos données et votre matériel cible.
  2. Le code le plus rapide est le code qui n'est jamais exécuté - triez vos données en lots et n'effectuez que des opérations coûteuses sur les données dont vous avez besoin
  3. La manière dont vous stockez vos données est essentielle - visez un accès contigu, cela vous permet de traiter par lots à grande vitesse.
  4. Parellisez tout ce que vous pouvez
  5. Les processeurs modernes sont rapides, la RAM moderne est très lente. Les erreurs de cache sont mortelles.
  6. Poussez autant que vous le pouvez sur le GPU - il dispose d'une mémoire locale rapide et peut donc parcourir les données, mais vous devez l'aider en organisant correctement vos données.
  7. Évitez de faire beaucoup de commutateurs d'état de rendu (encore une fois, regroupez des données de vertex similaires) car cela provoque le blocage du GPU
  8. Swizzle vos textures et assurez-vous qu'elles sont des puissances de deux - cela améliore les performances du cache de texture sur le GPU.
  9. Utilisez les niveaux de détail autant que vous le pouvez - versions basse / moyenne / haute des modèles 3D et basculez en fonction de la distance du lecteur de la caméra - inutile de rendre une version haute résolution s'il ne fait que 5 pixels à l'écran.

39

Les jeux 3D sont parfaits pour tromper vos yeux. Par exemple, il existe une technique appelée occlusion ambiante de l'espace d'écran (SSAO) qui donnera une sensation plus réaliste en ombrageant les parties d'une scène proches des discontinuités de surface. Si vous regardez les coins de votre mur, vous verrez qu'ils apparaissent légèrement plus foncés que les centres dans la plupart des cas.

Le même effet peut être obtenu en utilisant la radiosité, qui est basée sur une simulation assez précise. La radiosité prendra également en compte plus d'effets des lumières rebondissantes, etc., mais elle est coûteuse en calcul - c'est une technique de traçage de rayons.

Ceci n'est qu'un exemple. Il existe des centaines d'algorithmes pour l'infographie en temps réel et ils sont essentiellement basés sur de bonnes approximations et font généralement beaucoup d'hypothèses. Par exemple, le tri spatial doit être choisi très soigneusement en fonction de la vitesse, de la position typique de la caméra ainsi que de la quantité de changements apportés à la géométrie de la scène.

Ces `` optimisations '' sont énormes - vous pouvez implémenter un algorithme efficacement et le faire fonctionner 10 fois plus vite, mais choisir un algorithme intelligent qui produit un résultat similaire ("tricherie") peut vous faire passer de O (N ^ 4) à O ( log (N)).

L'optimisation de la mise en œuvre réelle est ce qui rend les jeux encore plus efficaces, mais ce n'est qu'une optimisation linéaire.


30

Eeeeek!

Je sais que cette question est ancienne, mais c'est excitant que personne n'ait mentionné VSync !!! ???

Vous avez comparé l'utilisation du processeur du jeu à 60 ips à l'utilisation du processeur de la démo de la théière à 60 ips.

N'est-il pas évident que les deux fonctionnent (plus ou moins) à exactement 60 ips? Cela conduit à la réponse ...

Les deux applications fonctionnent avec vsync activé! Cela signifie (abrégé) que la fréquence d'images de rendu est verrouillée sur «l'intervalle vide vertical» de votre moniteur. Le matériel graphique (et / ou le pilote) ne sera rendu qu'au max. 60 ips. 60fps = 60Hz (Hz = par seconde) taux de rafraîchissement. Vous utilisez donc probablement un tube cathodique assez ancien et scintillant ou un écran LCD commun. Sur un tube cathodique fonctionnant à 100 Hz, vous verrez probablement des fréquences d'images allant jusqu'à 100 Hz. VSync s'applique également de la même manière aux écrans LCD (ils ont généralement une fréquence de rafraîchissement de 60 Hz).

Ainsi, la démo de la théière peut en fait fonctionner beaucoup plus efficacement! S'il utilise 30% du temps CPU (par rapport à 50% du temps CPU pour GTA IV), il utilise probablement moins de temps CPU à chaque image et attend juste plus longtemps le prochain intervalle vide vertical. Pour comparer les deux applications, vous devez désactiver vsync et mesurer à nouveau (vous mesurerez des fps beaucoup plus élevés pour les deux applications).

Parfois, il est correct de désactiver vsync (la plupart des jeux ont une option dans ses paramètres). Parfois, vous verrez des "artefacts déchirants" lorsque vsync est désactivé.

Vous pouvez trouver des détails sur celui-ci et pourquoi il est utilisé sur wikipedia: http://en.wikipedia.org/wiki/Vsync


Je suis d'accord, pour obtenir une meilleure comparaison, vous devez désactiver vsync. Cependant, la racine du problème tient toujours. 30% pour la théière contre 50% d'utilisation du processeur pour le jeu est une différence plus petite que ce à quoi on pourrait normalement s'attendre. Mais je me souviens qu'au début, la cartographie de l'environnement commençait à devenir populaire et que la démo sympa de nVidia à l'époque était une théière mappée sur l'environnement qui tournait. Ces démos n'atteignaient généralement même pas 60 fps dans la journée. Je suppose que mon point est que ces démos de théière repoussent souvent les limites d'un nouvel effet visuel.
Steve Wortham

25

Bien que de nombreuses réponses ici fournissent d'excellentes indications sur la façon dont je vais plutôt répondre à la question plus simple de savoir pourquoi

Le meilleur exemple (certainement l'un des plus connus) est peut-être le logiciel d'identification. Ils ont réalisé très tôt, à l'époque de Commander Keen (bien avant la 3D), que proposer un moyen astucieux de réaliser quelque chose 1 , même si cela reposait sur du matériel moderne (dans ce cas une carte graphique EGA!) Graphiquement supérieur à la concurrence que cela ferait ressortir votre jeu. C'était vrai, mais ils ont en outre réalisé que, plutôt que d'avoir à créer eux-mêmes de nouveaux jeux et contenus, ils pouvaient obtenir une licence pour la technologie, obtenant ainsi des revenus d'autres personnes tout en étant en mesure de développer la prochaine génération de moteurs et ainsi de sauter à nouveau la concurrence. .

Les capacités de ces programmeurs (associées à leur sens des affaires) sont ce qui les a rendus riches.

Cela dit, ce n'est pas nécessairement l'argent qui motive ces personnes. C'est probablement tout autant le désir de réaliser, d'accomplir. L'argent qu'ils ont gagné au début signifie simplement qu'ils ont maintenant du temps à consacrer à ce qu'ils aiment. Et bien que beaucoup aient des intérêts extérieurs, presque tous continuent de programmer et d'essayer de trouver des moyens de faire mieux que la dernière itération.

En termes simples, la personne qui a écrit la démo de la théière a probablement eu un ou plusieurs des problèmes suivants:

  • moins de temps
  • moins de ressources
  • moins de récompense
  • moins de concurrence interne et externe
  • buts moindres
  • moins de talent

Le dernier peut sembler dur 2 mais il y en a clairement qui sont meilleurs que d'autres, les courbes en cloche ont parfois des extrémités extrêmes et elles ont tendance à être attirées par les extrémités extrêmes correspondantes de ce qui est fait avec cette compétence.

Les objectifs moindres sont probablement la principale raison. L'objectif de la démo de la théière était juste cela, une démo. Mais pas une démonstration de la compétence des programmeurs 3 . Ce serait une démo d'une petite facette d'un (gros) OS, dans ce cas le rendu DX.

Pour ceux qui regardent la démo, cela n'aurait pas d'importance, il utilisait beaucoup plus de CPU que nécessaire tant que cela semblait assez bon. Il n'y aurait aucune incitation à éliminer les déchets lorsqu'il n'y aurait pas de bénéficiaire. En comparaison, un jeu aimerait avoir des cycles de rechange pour une meilleure IA, un meilleur son, plus de polygones, plus d'effets.


  1. dans ce cas, défilement fluide sur le matériel PC
  2. Probablement plus que moi, donc nous sommes clairs à ce sujet
  3. à proprement parler, cela aurait également été une démo pour son manager, mais là encore, le moteur serait le temps et / ou la qualité visuelle.

17

Pour plusieurs raisons

  • Les moteurs de jeu 3D sont hautement optimisés
  • la plupart du travail est effectué par votre carte graphique
  • 50% Hm, laissez-moi deviner que vous avez un dual core et qu'un seul core est utilisé ;-)

EDIT: Pour donner quelques chiffres

2,8 Ghz Athlon-64 avec GPU NV-6800. Les résultats sont:

  • Processeur: 72,78 Mflops
  • GPU: 2440,32 Mflops

@stacker: êtes-vous en train de dire que tous les calculs qui ont lieu dans des jeux 3D de premier ordre qui ne sont pas effectués par le GPU sont en fait mono-threadés et rempliraient, par hasard, 100% du CPU? Cela signifie-t-il que les performances du jeu seraient liées à un cœur non GPU? Je trouve cela très difficile à croire.
SyntaxeT3rr0r

4
Cela n'implique pas que le programme est mono-thread - cela implique simplement qu'au moins un thread va aussi vite que possible. Ce qui est raisonnable, car pourquoi voudriez-vous que cela aille plus lentement? En revanche, de nombreux jeux sont presque entièrement mono-threadés. Il est très difficile d'écrire des simulations complexes de manière efficace en multithreading, car la situation typique dans les systèmes concurrents / distribués d'accepter un peu plus de latence pour acheter beaucoup plus de débit n'est pas bonne pour un jeu censé être réactif.
Kylotan

8

Parfois, une scène peut avoir plus de choses qu'il n'y paraît. Par exemple, une théière rotative avec des milliers de sommets, un mappage d'environnement, un mappage de relief et d'autres shaders de pixels complexes rendus simultanément équivaut à beaucoup de traitement. Souvent, ces démos de théière sont simplement destinées à montrer une sorte d'effet spécial. Ils peuvent également ne pas toujours tirer le meilleur parti du GPU lorsque les performances absolues ne sont pas l'objectif.

Dans un jeu, vous pouvez voir des effets similaires, mais ils sont généralement effectués de manière compromise afin de maximiser la fréquence d'images. Ces optimisations s'étendent à tout ce que vous voyez dans le jeu. Le problème devient: "Comment pouvons-nous créer la scène la plus spectaculaire et la plus réaliste avec le moins de puissance de traitement?" C'est ce qui fait des programmeurs de jeux l'un des meilleurs optimiseurs du marché.


4
  1. Gestion de scène. arbres kd, abattage frustrum, bsps, boîtes englobantes héritières, ensembles de visibilité partielle.
  2. LOD. Changement des versions de détail inférieures pour remplacer les objets éloignés.
  3. Imposteurs. Comme LOD mais pas même un objet juste une image ou un «panneau d'affichage».
  4. SIMD.
  5. Gestion de la mémoire personnalisée. Mémoire alignée, moins de fragmentation.
  6. Structures de données personnalisées (c'est-à-dire pas de STL, création de modèles relativement minime).
  7. Assemblage par endroits, principalement pour SIMD.

4

D'après toutes les réponses qualifiées et bonnes données, celle qui compte manque toujours: le compteur d'utilisation du processeur de Windows n'est pas très fiable. Je suppose que cette simple démo de théière appelle simplement la fonction de rendu dans sa boucle inactive, bloquant le swap de tampon.

Désormais, le compteur d'utilisation du processeur Windows regarde simplement le temps processeur passé dans chaque processus, mais pas la manière dont ce temps processeur est utilisé. Essayez d'ajouter un

Sleep(0);

juste après le retour de la fonction de rendu, et comparez.


J'avais une démo de théière DX qui utilisait toujours 25% de mon CPU. Il s'est avéré que c'était parce que j'étais sur un quad core et, pour verrouiller la boucle de jeu à 60 fps, j'avais une boucle "Are we there yet" qui vérifiait constamment l'heure. Je l'ai mis en veille (timeToNextFrame) et l'utilisation du processeur a chuté à près de 0.
Jonathan Pierce

3

De plus, il existe de nombreuses astuces d'un point de vue artistique pour économiser de la puissance de calcul. Dans de nombreux jeux, en particulier les plus anciens, les ombres sont précalculées et «cuites» directement dans les textures de la carte. Plusieurs fois, les artistes ont essayé d'utiliser des plans (deux triangles) pour représenter des choses comme des arbres et des effets spéciaux alors que cela ressemblait à peu près au même. Le brouillard dans les jeux est un moyen simple d'éviter de rendre des objets éloignés, et souvent, les jeux auraient plusieurs résolutions de chaque objet pour les vues de loin, moyennes et proches.


1

Le cœur de toute réponse devrait être celui-ci - Les transformations que les moteurs 3D effectuent sont principalement spécifiées dans des additions et des multiplications (algèbre linéaire) (pas de branches ni de sauts), les opérations d'un dessin d'une seule image sont souvent spécifiées de manière à multiplier ces tâches add-mul peuvent être effectuées en parallèle. Les cœurs GPU sont très bons add-mul's, et ils ont des dizaines ou des centaines de cœurs add-mull.

Le processeur doit faire des choses simples - comme l'IA et d'autres logiques de jeu.


1

Comment un grand jeu PC comme GTA IV peut-il utiliser 50% de mon processeur et fonctionner à 60 ips alors qu'une démo DX d'une théière rotative à 60 ips utilise 30%?

Bien que GTA soit probablement plus efficace que la démo DX, mesurer l'efficacité du processeur de cette manière est essentiellement cassé. L'efficacité peut être définie, par exemple, par la quantité de travail que vous effectuez à un moment donné. Un contre-exemple simple: créez un thread par CPU logique et laissez une simple boucle infinie s'exécuter dessus. Vous obtiendrez une utilisation du processeur de 100%, mais ce n'est pas efficace, car aucun travail utile n'est effectué.

Cela conduit également à une réponse: comment un jeu peut-il être efficace? Lors de la programmation de «grands grands jeux», un effort énorme est consacré à l'optimisation du jeu sous tous ses aspects (ce qui, de nos jours, inclut généralement des optimisations multi-cœurs). Quant à la démo DX, son objectif n'est pas de courir vite, mais plutôt de démontrer des concepts.


1

Je pense que vous devriez jeter un œil à l' utilisation du GPU plutôt qu'au CPU ... Je parie que la carte graphique est beaucoup plus occupée dans GTA IV que dans l'échantillon Teapot (elle devrait être pratiquement inactive).

Vous pourriez peut-être utiliser quelque chose comme ce moniteur pour vérifier que:

http://downloads.guru3d.com/Rivatuner-GPU-Monitor-Vista-Sidebar-Gadget-download-2185.html

Le framerate est également quelque chose à considérer, peut-être que l'échantillon de théière fonctionne à pleine vitesse (peut-être 1000fps) et la plupart des jeux sont limités à la fréquence de rafraîchissement du moniteur (environ 60fps).


1

Regardez la réponse sur vsync; c'est pourquoi ils fonctionnent à la même fréquence d'images.

Deuxièmement, le processeur manque de tête dans un match. Une explication simplifiée est que la boucle de jeu principale n'est qu'une boucle infinie:

while(1) { 
  update();
  render();
}

Même si votre jeu (ou dans ce cas, la théière) ne fait pas grand-chose, vous consommez toujours du processeur dans votre boucle.

Le processeur à 50% dans GTA est "plus productif" que les 30% dans la démo, car il est fort probable qu'il ne fait pas grand-chose du tout; mais la GTA met à jour des tonnes de détails. Même l'ajout d'un "Sleep (10)" à la démo fera probablement chuter son processeur d'une tonne.

Regardez enfin l'utilisation du GPU. La démo prend probablement <1% sur une carte vidéo moderne tandis que la GTA prendra probablement la majorité pendant le jeu.

En bref, vos repères et vos mesures ne sont pas précis.


1

La démo de la théière DX n'utilise pas 30% du processeur pour un travail utile. Il est occupé à attendre parce qu'il n'a rien d'autre à faire.


0

D'après ce que je sais de la série Unreal, certaines conventions sont rompues comme l'encapsulation. Le code est compilé en bytecode ou directement en code machine selon le jeu. En outre, les objets sont rendus et emballés sous la forme d'un maillage et des éléments tels que les textures, l'éclairage et les ombres sont précalculés alors qu'une animation 3D pure l'exige en temps réel. Lorsque le jeu est en cours d'exécution, il existe également des optimisations telles que le rendu uniquement des parties visibles d'un objet et l'affichage des détails de la texture uniquement en gros plan. Enfin, il est probable que les jeux vidéo soient conçus pour tirer le meilleur parti d'une plateforme à un moment donné (ex: Intelx86 MMX / SSE, DirectX, ...).


0

Je pense qu'il manque ici une partie importante de la réponse. La plupart des réponses vous indiquent "Connaissez vos données". Le fait est que vous devez, de la même manière et avec le même degré d'importance, connaître également votre:

  • CPU (horloge et caches)
  • Mémoire (fréquence et latence)
  • Disque dur (en termes de vitesse et de temps de recherche)
  • GPU (#cores, horloge et sa mémoire / caches)
  • Interfaces: contrôleurs Sata, révisions PCI, etc.

MAIS , en plus de cela, avec les ordinateurs modernes actuels, vous ne seriez jamais capable de lire une vraie vidéo 1080p à >> 30ftp (une seule image 1080p en 64 bits prendrait 15 000 Ko / 14,9 Mo). La raison en est à cause de l'échantillonnage / précision. Un jeu vidéo n'utiliserait jamais une double précision (64 bits) pour les pixels, images, données, etc ..., mais utiliserait plutôt une précision personnalisée inférieure (~ 4-8 bits) et parfois moins de précision redimensionnée avec des techniques d'interpolation pour permettre un calcul raisonnable temps.

Il existe d'autres techniques telles que le découpage des données (à la fois avec la norme OpenGL et l'implémentation logicielle), la compression de données, etc. Gardez également à l'esprit que les GPU actuels peuvent être> 300 fois plus rapides que les processeurs actuels en termes de capacité matérielle. Cependant, un bon programmeur peut obtenir un facteur 10-20x, à moins que votre problème ne soit entièrement optimisé et complètement parallélisable (en particulier la tâche parallélisable).

Par expérience, je peux vous dire que l'optimisation est comme une courbe exponentielle. Pour atteindre des performances optimales, le temps nécessaire peut être extrêmement important.

Donc pour revenir à la théière, vous devriez voir comment la géométrie est représentée, échantillonnée et avec quelle précision Vs voit dans GTA 5, en terme de géométrie / textures et le plus important, les détails (précision, échantillonnage, etc.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.