Est-il normal qu'un jeu utilise 100% de CPU?

23

Je viens d'implémenter la gestion des entrées multithread dans mon moteur de jeu où le code qui interroge le système d'exploitation pour en collecter les entrées et les horodater est dans un thread séparé et chaque image du thread principal je mange juste les entrées rassemblées jusqu'à un temps de jeu logique. Tout fonctionne, mais cette configuration utilise 100% de mon processeur. J'ai deux cœurs, et cela va jusqu'à 100% lors de l'exécution de mon jeu.

J'ai vérifié avec d'autres jeux pour voir s'ils le faisaient aussi. Par exemple, Skyrim et Doom 3 semblent bien avec un peu plus de 60% de CPU.

Est-il acceptable qu'un jeu qui utilise une entrée multithread utilise jusqu'à 100% de CPU? Sinon, quelles astuces ces jeux utilisent-ils pour réduire l'utilisation du processeur par le thread d'entrée?

The Light Spark
la source
7
Donc, ce que vous dites, vous avez essentiellement un fil avec une boucle while sans fin qui interroge constamment le système d'exploitation pour de nouveaux événements? while true do CheckForEvents;
Kromster dit soutenir Monica le
5
Si une application utilise 100% du temps CPU indépendamment de l'utilisation et de la vitesse CPU, alors elle pourrait à juste titre être considérée comme un bug. Vous ne devez pas utiliser plus de temps CPU que nécessaire pour rendre une image par cycle de rafraîchissement du moniteur.
kasperd
3
@TheLightSpark Le fil de sondage ne dort-il même pas? Si vous bouclez et vérifiez constamment sans dormir, vous allez probablement consommer beaucoup plus de temps CPU que nécessaire.
Luke
3
Re @Luke: Même dormir seulement une milliseconde entre les sondages réduira considérablement l'utilisation du processeur. Il y a quelque temps, j'ai écrit une interface graphique pour un outil de ligne de commande qui a pris un fichier d'entrée et créé un fichier de sortie à peu près de la même taille. Pour estimer le pourcentage, j'ai lu la taille du fichier de sortie et mis à jour la barre de progression (à l'aide while (true)). Utilisé 90% + d'un CPU pour le faire. L'ajout d'un Thread.Sleep(5)a réduit l'utilisation du processeur à moins de 40%. Le passage à 25 millisecondes entre les sondages l'a ramené à moins de 10%.
Cole Johnson
2
@AlecTeal Je pense que vous n'avez pas prêté assez d'attention à ce que j'ai dit. Rendre de meilleurs graphiques n'est pas la même utilisation, et bien sûr, activer de meilleurs graphiques augmentera la consommation du processeur. Mais si le passage à un processeur plus rapide faisait que votre code passait simplement plus de cycles à produire exactement le même résultat, votre code est défectueux. Mesurer automatiquement la qualité des graphiques pouvant être rendus avec un processeur spécifique est une valeur par défaut raisonnable. Mais vous devez permettre aux utilisateurs de choisir au cas où ils fonctionneraient sur batterie ou auraient également besoin d'un processeur pour les travaux en arrière-plan.
kasperd

Réponses:

41

Oui, c'est normal pour un jeu en temps réel d'essayer d'utiliser 100% CPU pour fonctionner aussi vite et aussi bien qu'il le peut. Ainsi, ce joueur voit autant d'images par seconde ou une bonne simulation physique ou toute autre chose que son PC peut fournir.

Dans votre cas - Non, cela ressemble à une conception inefficace, pour prendre un thread et le faire interroger pour les événements dans une boucle ( while true do CheckForEvents;). Corrigez-moi si je me trompe, mais OS interroge déjà les événements. Vous devez simplement les vérifier à partir de votre fil principal une fois par tick.

La boucle de jeu principale doit être suffisamment rapide pour fonctionner à plus de 30 ticks par seconde, ce qui est assez suffisant pour les commandes d'interrogation de nombreux jeux. Le joueur ne verra pas de différence si ses commandes sont traitées, par exemple 0-33 ms plus tard. D'un autre côté, vous auriez pu utiliser ce cœur de processeur supplémentaire pour des tâches plus bénéfiques, comme beaucoup plus d'intelligence artificielle ou de physique ou autre.

PS Comme demandé pour clarifier dans les commentaires, ne prenez pas aveuglément les chiffres ci-dessus pour tous les types de jeux. Alors que le jeu TBS pourrait avoir besoin d'un seul tick par tour et que le jeu RTS pourrait bien fonctionner avec 10 ticks par tour, d'autres genres, comme RaceSims, ont besoin de beaucoup plus. Et bien sûr, ne liez pas les tics logiques avec le framerate, ce sont deux choses distinctes.

Kromster dit soutenir Monica
la source
5
Je voterais pour cette question, mais je vois que vous recommandez 30 ticks par seconde. À mon humble avis (et ceux de nombreux autres joueurs), vous devez viser 60 ticks (et donc 60 images) par seconde. 60 FPS pour beaucoup de gens semble plus fluide, joue plus réactif et est moins susceptible de donner un certain sous-groupe d'utilisateurs du mal des transports.
Nzall
4
Un retard de 33 ms pour l'entrée est très perceptible ...
Synxis
1
@NateKerkhofs: Je viens du milieu RTS, où 10 ticks sont habituels. C'est un monde vaste, je vais ajouter des détails à ce sujet. Merci d'avoir souligné.
Kromster dit soutenir Monica le
1
@KromStern: Je ne peux pas parler entièrement pour Nate, mais le troisième paragraphe pourrait être interprété comme "30hz devrait être votre cible" bien qu'il puisse également être interprété comme "30hz est le minimum que vous pouvez tolérer" (ce qui peut être ce que vous vouliez dire ).
Sean Middleditch
1
L'utilisation de 100% de CPU est une pratique terrible. Vous défoncez des utilisateurs d'ordinateurs portables pour des trucs qui n'ont en aucune façon, forme ou forme, besoin d'utiliser 100% de CPU. Codez une boucle de jeu appropriée qui peut alimenter efficacement les images sur le moniteur.
Chris Dennett
9

Un jeu avec une actualisation constante de la fenêtre active sera principalement exécuté en mode plein écran et sera le seul (gros) programme de la machine géré par le système d'exploitation. Il est donc tout à fait acceptable d'utiliser 100% du CPU, car rien d'autre ne devrait en avoir besoin.

Cependant , cela ne signifie pas bien sûr que vous devez toujours utiliser 100% quel que soit votre état de jeu. La plupart des boucles de jeu utilisent une méthode de veille comme délimiteur de fréquence d'images si elles ont fini de rendre une image avant la limite de fréquence d'images, afin de ne pas utiliser le processeur pour rien.
C'est probablement ce qui se passe dans vos exemples: votre machine est plus rapide que Skyrim ou Doom 3 ne doit fonctionner, donc ils n'utilisent que ce dont ils ont besoin - mais tout ce dont ils ont besoin.

Comme l'a dit @KromSterm, le système d'exploitation interroge généralement déjà les événements pour vous, il n'est donc pas nécessaire de faire une boucle plus rapidement que celle du système d'exploitation. Si vous n'avez que deux cœurs, utiliser 100% du second uniquement pour la détection d'événements n'est pas une bonne idée, car si vous transférez uniquement des événements vers la boucle de mise à jour principale, son exécution est très rapide. Vous devriez essayer d'utiliser ce noyau pour une partie du travail de thread principal avec un autre thread à la place.

Aracthor
la source
"utiliser une méthode de sommeil" - ai-je raison de penser que c'est ce qu'on appelle un limiteur de fréquence d'images?
Gusdor
3
le sommeil n'est pas une méthode précise de limitation de trame, si le but est de limiter les trames pour surveiller le taux de rafraîchissement, alors le mieux est d'utiliser vsync supporté par le matériel (ou la synchronisation g de nvidia, si disponible)
Sarge Borsch
8

Il y a quelques inconvénients à viser à utiliser tout le temps CPU disponible dans un jeu PC ou mobile.

Configuration requise: si le jeu est jouable sur le PC sur lequel vous développez votre jeu, il peut ne pas être jouable sur un PC plus faible appartenant à quelqu'un qui a acheté votre jeu. Limiter l'utilisation du processeur gardera un jeu utilisable sur des machines que plus de gens sont susceptibles d'avoir déjà. Si vous voulez vraiment voir si vous limitez votre marché, testez vos jeux PC et ceux de vos concurrents sur un détachable alimenté par Atom tel que le Transformer Book, ou testez vos jeux mobiles sur un téléphone Android prépayé peu coûteux.

Consommation d'énergie: un ordinateur portable décharge sa batterie plus rapidement lorsque quatre cœurs sont utilisés à 100% de la fréquence maximale que lorsque, disons, deux cœurs sont utilisés à 60% de la demi-fréquence. Assurez-vous donc que votre thread d'interrogation de contrôleur, votre thread AI, votre thread physique et votre thread graphique sont bloqués jusqu'à ce qu'il soit temps de les exécuter à nouveau. Sauf dans quelques genres très capricieux, tels que les combats et le rythme, vous n'aurez pas besoin d'interroger les contrôleurs plus rapidement qu'environ 60 Hz, alors configurez votre fil d'interrogation pour qu'il s'exécute sur une minuterie de 60 Hz.

Variabilité physique: si la physique qui affecte le gameplay est plus détaillée sur des machines plus puissantes, la même action de joueur aura des résultats différents sur différentes machines. Cela signifie que le joueur peut tricher en utilisant une machine plus forte ou plus faible. Id's Quake III Arena est connu pour avoir une fréquence d'images affectant la hauteur de saut . Pour éviter cela, de nombreux jeux utilisent un pas de temps fixe pour la physique. Mais cela n'affecte pas la physique déconnectée du gameplay, comme les effets de particules ou les effets de tissu ou l'interpolation des coordonnées entre les images physiques pour rendre la vidéo à une fréquence d'images plus élevée que la physique. Concevez donc votre physique en utilisant une variante de modèle-vue-contrôleur l'architecture, où les choses essentielles (accélération, détection de coups, etc.) vont dans le modèle et les bonbons pour les yeux réglables vont dans la vue.

Variabilité de l'IA: si l'IA est plus détaillée sur des machines plus puissantes, les ennemis se comporteront différemment sur différentes machines. Par exemple, dans une implémentation Go ou Chess, l'adversaire sera plus faible sur un PC plus faible, et les joueurs peuvent tricher en jouant au jeu sur un PC plus faible ou en exécutant des processus d'arrière-plan tels que l'antivirus ou le transcodage vidéo ou les mises à jour du système d'exploitation.

Damian Yerrick
la source
4
+1 pour la consommation d'énergie. Surtout que vous devriez considérer l'industrie du mobile et de la tablette, où cela est extrêmement important.
akaltar
1
La consommation d'énergie affecte également le bruit, même sur les ordinateurs de bureau. Il est courant que les ordinateurs de bureau modernes gardent leurs ventilateurs lents et silencieux lorsque le système est froid. De plus, l'utilisateur peut peut-être encoder une vidéo (à faible priorité) pendant la lecture, de sorte que le temps CPU disponible ne soit pas perdu. Ou pour les joueurs qui diffusent sur Twitch, laisser plus de cycles pour l'encodage vidéo est un gros problème et permet une vidéo de meilleure qualité. (le codage vidéo est un compromis à trois voies entre le temps processeur, le débit binaire et la qualité, donc plus de temps processeur signifie un codage en temps réel avec une qualité supérieure au même débit binaire.)
Peter Cordes
1
L'utilisation de l'énergie devrait être la considération principale, toutes les autres considérations secondaires, à mon humble avis. La seule chose pour laquelle j'utiliserais 100% de CPU (si cela a vraiment aidé!) Est la réalité virtuelle.
Chris Dennett