Quels sont les avantages du plafonnement des images par seconde? (Si seulement)


13

Je travaille sur un jeu simple en OpenGL, utilisant SDL pour l'initialisation et la saisie de l'affichage, et il semble qu'en termes de timing, j'ai deux options à ma disposition. Le numéro un est juste en train de dormir pour le optimalTimePerFrame - theTimeTakenToRender, lorsque le optimalTimePerFrame en secondes = 1 / theFramerateCap. (Je ne suis pas tout à fait sûr de savoir si cela est nécessaire, car cela équivaut à utiliser vsync, ce qui peut être plus précis. Si mon hypothèse est correcte, veuillez me dire si SDL + OpenGL a vsync par défaut, et si non comment pour l'activer.) L'autre consiste à mesurer le temps écoulé depuis le rendu de la dernière image et à ajuster simplement le mouvement en conséquence. (Plus le temps de rendu d'une image est court, moins les entités se déplacent loin dans cette image). En termes de performances, de diminution du scintillement, etc., quels sont les avantages et les inconvénients de ces deux méthodes?

Réponses:


15

Si votre temps de trame est imprévisible (que ce soit votre faute ou non; le système d'exploitation peut utiliser des ressources de temps en temps, etc.), le plafonnement à une fréquence de trame prévisible qui est quelque peu inférieure à votre fréquence d'images réalisable fera beaucoup pour une latence prévisible , ce qui peut rendre le jeu beaucoup mieux.

Changer la durée entre le moment où vous traitez l'entrée et le rendu des changements liés à cette entrée peut vous faire du mal - même si en moyenne vous obtenez moins de latence entre les deux, la "gigue" peut être perceptible par les humains (consciemment ou inconsciemment).

Voir la présentation de Microsoft GameFest What In a Frame: Tearing, Latency, and Frame Rate pour un aperçu ici. Carmack a également une série de billets de blog qui sont utiles à cet égard.

Sachez également que certains calculs peuvent s'effondrer lorsque vous exécutez des images en utilisant des deltaTvaleurs faibles - ou même lorsque vous utilisez des variables deltaT(les choses peuvent devenir plus difficiles ou même difficiles à faire de manière "stable" et prévisible, ce qui est important pour les choses). comme les rediffusions et certaines formes de synchronisation réseau). Voir Fix Your Timestep pour un aperçu ici.


1
(Au fait, je vous recommande fortement de ne pas plafonner par "sommeil"; déterminez quelle est votre situation vsync sur votre plate-forme et utilisez vsync pour vous conduire. C'est beaucoup plus prévisible et utilise généralement moins de ressources.)
leander

Merci, je vais certainement essayer de plafonner le framerate. Savez-vous comment activer vsync en utilisant SDL?
w4etwetewtwet

1
Dans SDL 2.0, vous pouvez activer vsync en passant l'indicateur SDL_RENDERER_PRESENTVSYNC à l'appel SDL_CreateRenderer, par exempleSDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
TJS

12

Vous finirez par utiliser beaucoup moins de CPU (les multi-tâches vous remercieront) et les gens sur les appareils mobiles apprécieront également cela.


4
Sans oublier une consommation d'énergie plus faible (importante pour les appareils mobiles / ordinateurs portables) et moins de génération de chaleur.
zeel

Cela me rappelle certains problèmes de jeux, lorsque le FPS dans les menus était illimité et incroyablement élevé, tout comme 900fps, et cela stressait vraiment le CPU / GPU -> température plus élevée -> plus de bruit.
Kromster dit soutenir Monica le

10

Vous ne devriez jamais, jamais, jamais, jamais, jamais utiliser Sleep pour contrôler la fréquence d'images .

Cela a déjà été fait et je vous renvoie à l'autre question pour une discussion sur les raisons. Une chose non mentionnée ici est qu'à la fréquence de rafraîchissement moderne typique de 60 Hz, et avec la granularité typique de 1 milliseconde des appels de sommeil, il est en fait impossible de dormir pendant la durée correcte entre les images.

Je ne dis pas que céder du CPU si vous n'avez rien à faire est une mauvaise chose; loin de là. Mais ce n'est pas la même chose que de contrôler le framerate et Sleep est une solution qui convient aux premiers mais pas aux seconds.

Au lieu de cela, vérifiez le temps écoulé, et s'il est temps d'exécuter une trame, faites-le, sinon - et si vous voulez céder du CPU - Dormez un minimum de temps - 1 milliseconde. Assurez-vous également que votre minuterie de sommeil est correctement configurée pour votre plate-forme afin de vous donner une bonne résolution; c'est-à-dire que lorsque vous émettez cet appel "Sleep (1)", vous avez réellement une chance de vraiment dormir pendant 1 milliseconde, plutôt que quelque chose comme 15, 20 ou 30 (ce qui serait le cas autrement). Je pense que SDL le fera automatiquement pour vous.

Vous pouvez également y ajouter du mou, de sorte que si le moment est venu d'exécuter un cadre, vous arrêtez de dormir et commencez à courir à plat jusqu'à ce que le cadre s'exécute, ce qui peut vous aider à atteindre plus précisément votre intervalle de cadre souhaité.

À quoi cela ressemble, c'est tout un tas d'appels Sleep (1) entrecoupés de la trame occasionnelle, et c'est OK. Vous abandonnez toujours le processeur lorsque vous n'en avez pas besoin, mais vos images pourront toujours fonctionner à l'heure.



0

Comme mentionné précédemment, cela réduit l'utilisation du processeur. D'un autre côté, et de plus en plus important, cela réduit également la durée de vie de la batterie. À titre d'exemple, FTL fonctionne à près de 100% CPU sur mon MBA. En conséquence, il décharge la batterie en> 2 heures et fonctionne très chaud. (Comme résultat plus direct, je l'ai désinstallé et ne le joue plus ...). Un bouchon de cadre aurait empêché cela.

Un autre avantage non mentionné est, si c'est un jeu multijoueur, vous égalisez également le terrain de jeu en donnant à tout le monde la même expérience.


Votre framerate et votre boucle de mise à jour du jeu ne doivent pas nécessairement fonctionner à la même vitesse, donc donner aux gens la même expérience ne dépend pas uniquement du framerate.
Thomas
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.