Comment les jeux 3D sont-ils si efficaces?

Il y a quelque chose que je n’ai jamais compris. Comment un grand jeu PC tel que GTA IV peut-il utiliser 50% de mon processeur et fonctionner à 60fps alors qu’une démo DX d’une Teapot tournante à 60fps utilise 30%?

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

  1. Les jeux sont optimaux quant à ce qu’ils doivent rendre et
  2. Ils tirent un avantage particulier de votre matériel.

Par exemple, une optimisation simple que vous pouvez faire consiste à ne pas réellement essayer de dessiner des choses invisibles. Considérez une scène complexe comme un paysage urbain de Grand Theft Auto IV . Le moteur de rendu ne rend pas tous les bâtiments et les structures. Au lieu de cela, il rend uniquement 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 shell é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 un ensemble de matériel particulier, pour permettre des accélérations encore meilleures.

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

… alors qu’une démo DX d’une théière tournante à 60fps utilise 30%?

Il est courant que les démonstrations d’API graphiques (telles que dxdemo ) dxdemo sur ce qu’on appelle un moteur de rendu lorsque votre matériel ne prend pas en charge toutes les fonctionnalités nécessaires pour afficher un bel exemple. Ces caractéristiques peuvent inclure des éléments tels que les ombres, la reflection, le lancer de rayons, la physique, etc.

Cela imite la fonction d’un périphérique matériel 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, 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.

Patience, compétence technique et endurance.

Tout d’abord, une démo DX est avant tout une aide pédagogique, elle est donc faite pour la clarté et non la rapidité d’exécution.

C’est un sujet assez important à condenser, mais le développement de jeux consiste avant tout à 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é – sortingez vos données en lots et effectuez uniquement des opérations coûteuses sur les données dont vous avez besoin
  3. La manière dont vous stockez vos données est la clé: visez un access contigu, cela vous permet de traiter par lots à grande vitesse.
  4. Parellise tout ce que tu peux éventuellement
  5. Les processeurs modernes sont rapides, la mémoire vive moderne est très lente. Les manques de cache sont mortels.
  6. Poussez autant sur le GPU que vous le pouvez – il dispose d’une mémoire locale rapide, ce qui permet de parcourir les données, mais vous devez l’aider en organisant correctement vos données.
  7. Évitez de faire beaucoup de commutateurs de rendu (encore une fois par lot de données de sumts similaires), car cela entraîne le blocage du GPU
  8. Faites tourner vos textures et assurez-vous qu’elles sont puissantes – 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 commutation en fonction de la distance par rapport au lecteur de caméra – il est inutile de rendre une version haute résolution si ce n’est que 5 pixels à l’écran.

Les jeux 3D sont parfaits pour tromper vos yeux. Par exemple, il existe une technique appelée occlusion ambiante de l’écran (SSAO) qui donnera une impression plus réaliste en masquant 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 repose sur une simulation plutôt précise. La radiosité prendra également en compte plus d’effets des lumières rebondissantes, etc., mais elle est coûteuse en calculs – 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 reposent essentiellement sur de bonnes approximations et font généralement des hypothèses. Par exemple, le sorting spatial doit être choisi très soigneusement en fonction de la vitesse, de la position typique de la caméra et de la quantité de modifications apscopes à la géomésortinge de la scène.

Ces «optimisations» sont énormes – vous pouvez implémenter un algorithme efficacement et le rendre 10 fois plus rapide, mais choisir un algorithme intelligent produisant un résultat similaire («sortingcher») peut vous faire passer de O (N ^ 4) à O ( log (N)).

L’optimisation de l’implémentation est ce qui rend les jeux encore plus efficaces, mais il ne s’agit que d’une optimisation linéaire.

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 images par seconde à l’utilisation du processeur de la démo de la théière à 60 images par seconde.

N’est-il pas évident que les deux fonctionnent (plus ou moins) exactement à 60 images par seconde? Cela conduit à la réponse …

Les deux applications fonctionnent avec vsync activé! Cela signifie que le framerate de rendu est verrouillé sur l’intervalle vide vertical de votre moniteur. Le matériel graphique (et / ou le pilote) ne sera rendu qu’à max. 60fps. 60fps = 60Hz (Hz = par seconde) taux de rafraîchissement. Donc, vous utilisez probablement un tube cathodique assez vieux ou scintillant ou un écran LCD commun. Sur un écran CRT fonctionnant à 100 Hz, vous verrez probablement des cadrages allant jusqu’à 100 Hz. VSync s’applique également de manière similaire aux écrans LCD (ils ont généralement un taux de rafraîchissement de 60 Hz).

La démonstration de la théière peut donc être beaucoup plus efficace! S’il utilise 30% du temps CPU (contre 50% du temps CPU pour GTA IV), il utilise probablement moins de temps processeur par trame et attend simplement plus longtemps l’intervalle de blanc vertical suivant. Pour comparer les deux applications, vous devez désactiver vsync et mesurer à nouveau (vous mesurerez beaucoup plus fps pour les deux applications).

Parfois, il est possible de désactiver vsync (la plupart des jeux ont une option dans ses parameters). Parfois, vous verrez “déchirer des artefacts” lorsque vsync est désactivé.

Vous pouvez trouver des détails à ce sujet et pourquoi il est utilisé à Wikipedia: http://en.wikipedia.org/wiki/Vsync

Bien que de nombreuses réponses ici fournissent d’excellentes indications sur la manière dont je vais plutôt répondre à la question la plus simple de savoir pourquoi

  • GTA4 a pris 400 millions de dollars la première semaine
  • Crytech a écrit une démo graphique extrêmement impressionnante pour permettre à nVidia de se montrer lors d’une foire commerciale. Les impressions qui en ont résulté leur ont permis de créer ce qui deviendrait FarCry.
  • Le chiffre d’affaires et le résultat opérationnel 2005 de Valve ont été respectivement de 70 et 55 millions USD.

Peut-être le meilleur exemple (certainement l’un des plus connus) est le logiciel Id. Très tôt, à l’époque du commandant Keen (bien avant 3D), ils ont réalisé une manière intelligente de réaliser quelque chose 1 , même si elle s’appuyait sur du matériel moderne (en l’occurrence une carte graphique EGA!) la compétition que cela ferait ressortir votre jeu. Cela était vrai, mais ils réalisèrent que, plutôt que de devoir proposer eux-mêmes de nouveaux jeux et contenus, ils pouvaient obtenir une licence pour la technologie, obtenant ainsi des revenus tout en développant la prochaine génération de moteur. .

Les capacités de ces programmeurs (associées au 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 autant le désir de réaliser que d’accomplir. L’argent qu’ils ont gagné dans les premiers jours signifie simplement qu’ils ont maintenant le temps de se consacrer à ce qu’ils aiment. Et tandis que beaucoup ont des intérêts extérieurs, presque tous continuent à programmer et essaient de trouver des moyens de faire mieux que la dernière itération.

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

  • moins de temps
  • moins de ressources
  • moins d’incitation à la récompense
  • moins de concurrence interne et externe
  • objectives inférieurs
  • moins de talent

Le dernier peut paraître dur 2, mais il est clair que certains 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 de ce qui est fait avec cette compétence.

Les objectives moins importants sont en fait probablement la raison principale. La cible de la démonstration de théière était juste une démo. Mais pas une démonstration de la compétence des programmeurs 3 . Ce serait une démonstration d’une petite facette d’un (grand) OS, dans ce cas le rendu DX.

Pour ceux qui regardent la démo, cela ne serait pas très important, il utilisait beaucoup plus de processeur que nécessaire , du moment que cela semblait suffisant. 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 en douceur sur le matériel PC
  2. Probablement plus que moi donc nous sums clairs à ce sujet
  3. À proprement parler, cela aurait été une démonstration à son manager, mais là encore, le lecteur aurait du temps et / ou de la qualité visuelle.

A cause de quelques raisons

  • Les moteurs de jeux 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: Donner quelques chiffres

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

  • CPU: 72.78 Mflops
  • GPU: 2440.32 Mflops

Parfois, une scène peut avoir plus de choses qu’elle n’apparaît. Par exemple, une théière en rotation avec des milliers de sumts, un mappage d’environnement, un mappage de bump et d’autres pixels complexes sont rendus simultanément. Souvent, ces démonstrations de théière sont simplement destinées à montrer une sorte d’effet spécial. Ils peuvent également ne pas toujours utiliser au mieux le GPU lorsque les performances absolues ne sont pas le but.

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 est le suivant: “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 que les programmeurs de jeux sont parmi les meilleurs optimiseurs.

  1. Gestion de la scène kd-trees, frustrum culling, bsps, boîtes englobantes hiérarchiques, ensembles de visibilité partielle.
  2. LOD. Désactiver les versions de détail inférieures pour remplacer les objects éloignés.
  3. Des imposteurs Comme LOD mais pas même un object, 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.-à-d. Pas de STL, modélisation relativement minime).
  7. Assemblage par endroits, principalement pour SIMD.

Par toutes les bonnes réponses qualifiées et correctes, celle qui importe est toujours manquante: le compteur d’utilisation du processeur de Windows n’est pas très fiable. Je suppose que cette simple démonstration de théière appelle simplement la fonction de rendu dans sa boucle inactive, bloquant le swap du tampon.

Maintenant, le compteur d’utilisation du processeur Windows ne regarde que le temps processeur dépensé dans chaque processus, mais pas le temps d’utilisation du processeur. Essayez d’append un

 Sleep(0); 

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

De plus, il existe de nombreuses astuces sur le plan artistique pour économiser de la puissance informatique. 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 sortingangles) pour représenter des choses comme des arbres et des effets spéciaux alors qu’ils sembleraient presque identiques. Le brouillard dans les jeux est un moyen facile d’éviter de rendre des objects éloignés, et souvent, les jeux ont plusieurs résolutions de chaque object pour les vues éloignées, moyennes et proches.

Le cœur de toute réponse devrait être le suivant: les transformations effectuées par les moteurs 3D sont principalement définies dans les additions et les multiplications (algèbre linéaire) (pas de twigs ou de sauts), les opérations sur un seul cadre sont souvent spécifiées de manière multiple. ces tâches peuvent être effectuées en parallèle. Les cœurs de GPU sont très bien ajoutés, et ils ont des dizaines ou des centaines de cœurs supplémentaires.

Le processeur est laissé à faire des choses simples – comme l’IA et d’autres logiques de jeu.

Comment un grand jeu PC tel que GTA IV peut-il utiliser 50% de mon processeur et fonctionner à 60fps alors qu’une démo DX d’une Teapot tournante à 60fps utilise 30%?

Bien que GTA soit très probablement plus efficace que la démo DX, la mesure de l’efficacité du processeur est essentiellement cassée. L’efficacité pourrait être définie, par exemple, par le travail que vous effectuez par heure donnée. Un contre-exemple simple: engendrer un thread par un processeur logique et laisser 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 jeux géniaux”, un effort considérable est consacré à l’optimisation du jeu sous tous ses aspects (ce qui inclut généralement les optimisations multi-cœurs). En ce qui concerne la démo DX, son objective n’est pas de courir rapidement, mais plutôt de démontrer des concepts.

Je pense que vous devriez jeter un oeil à l’ utilisation du GPU plutôt qu’au processeur … Je parie que la carte graphique est beaucoup plus chargée dans GTA IV que dans l’échantillon de la Théière (elle devrait être pratiquement inactive).

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

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

De plus, le framerate est quelque chose à considérer, peut-être que l’échantillon de théière tourne à plein régime (peut-être 1000fps) et que la plupart des jeux sont limités à la fréquence de rafraîchissement du moniteur (environ 60fps).

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

Deuxièmement, le CPU manque de leadership dans un jeu. Une explication simplifiée est que la boucle du jeu principal est juste 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 êtes toujours en train de manger du CPU dans votre boucle.

Le processeur de 50% de GTA est “plus productif” que le 30% de la démo, car il est plus que probable qu’il ne fasse pas grand-chose; mais le GTA met à jour des tonnes de détails. Même en ajoutant un “Sleep (10)” à la démo, sa capacité de traitement sera probablement réduite d’une tonne.

Enfin, regardez l’utilisation du GPU. La démo prend probablement moins de 1% sur une carte vidéo moderne alors que le GTA prendra probablement la majorité au cours du jeu.

En bref, vos tests et vos mesures ne sont pas exacts.

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

D’après ce que je sais de la série Unreal, certaines conventions sont cassées comme une encapsulation. Le code est compilé en bytecode ou directement en code machine en fonction du jeu. De plus, les objects sont rendus et empaquetés sous la forme d’un maillage et des choses telles que les textures, l’éclairage et les ombres sont précalculées 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 object 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 plate-forme à un moment donné (ex: Intelx86 MMX / SSE, DirectX,…).

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

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

MAIS , en plus de cela, avec les ordinateurs modernes, 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 / de la précision. Un jeu vidéo n’utiliserait jamais une double précision (64bits) pour les pixels, les images, les données, etc., mais utiliserait plutôt une précision personnalisée inférieure (~ 4-8 bits) et parfois moins précise avec des techniques d’interpolation pour permettre un calcul raisonnable temps.

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

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 devez voir comment la géomésortinge est représentée, échantillonnée et avec quelle précision Vs voit dans GTA 5, en termes de géomésortinge / textures et surtout, les détails (précision, échantillonnage, etc.)