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?
la source
SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
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.
la source
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.
la source
L'avantage le plus important du plafonnement de la fréquence d'images est qu'il peut aider à éviter des dommages physiques littéraux à la machine. Ils ont oublié de le faire sur Starcraft II, ce qui s'est avéré très problématique (et coûteux) pour certains utilisateurs jusqu'à ce qu'ils le corrigent.
la source
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.
la source