Est-il sûr d'utiliser Sleep () dans la boucle de jeu (sous Windows)?


27

Est-il sûr d'utiliser la fonction Sleep () sous Windows dans la boucle de jeu (C ++)? Je veux avoir une fréquence d'images fixe.


Vous devez clarifier ce que vous entendez par «sûr». Bien sûr, il est sûr et ne va pas corrompre la mémoire ou faire exploser le PC des joueurs.
Kromster dit soutenir Monica le

Réponses:


32

Non ce n'est pas. Le sommeil ne garantit qu'un temps minimum pour dormir, mais il peut en fait dormir pendant une durée arbitraire au-delà. La résolution de votre minuterie (définie via timeBeginPeriod) est également importante pour cela, et même si vous utilisez autre chose (comme QueryPerformanceCounter) pour votre minuterie, vous avez toujours besoin de timeBeginPeriod pour contrôler le sommeil.

Donc en résumé:

  • Le temps de sommeil n'est qu'un minimum garanti et le temps de sommeil réel peut être plus élevé.
  • Sensible à la valeur définie (ou non définie) via timeBeginPeriod.

Le seul cas raisonnable pour utiliser Sleep serait si vous vouliez réduire l'utilisation du processeur, par exemple pour les appareils mobiles. Même alors, vous utiliseriez Sleep (1); l'utiliser pour contrôler les framerates n'est pas la voie à suivre.

Forcer vsync sur est probablement un moyen courant d'obtenir un taux de rafraîchissement fixe, mais même dans ce cas, différents matériels fonctionneront à des taux de rafraîchissement différents et vous ne pourrez pas avoir un taux de rafraîchissement fixe cohérent sur différentes machines (cela dépend du type de matériel vous visez bien sûr).

À ce stade, il est nécessaire de mentionner cet article: Gaffer On Games - Fix Your Timestep! . Cela décrit les étapes dont vous avez besoin pour obtenir un pas de temps cohérent dans votre simulation.


Un immense merci pour le lien. Jusqu'à présent, j'utilisais généralement l'approche "pas de temps variable" décrite dans l'article.
Ivan Vučica

Le sommeil est également dangereux sur les machines sur lesquelles Intel a activé le pas de vitesse.
waterwizard11

"mais il peut en fait dormir pendant n'importe quelle période arbitraire." Eh bien, cela doit être prouvé, je suppose ... Je n'en ai jamais vu de preuve, donc je suppose que c'est l'une de ces «définitions». Bonne réponse cependant et oui, vous ne pouvez pas (même s'il était, tel qu'il est, précis) utiliser n'importe quel type de sommeil pour définir un débit d'images fixe (enfin vous pouvez mais vous avez besoin d'une minuterie de haute précision pour le faire).
Valmond

2
Par MSDN - "Notez qu'un thread prêt n'est pas garanti pour s'exécuter immédiatement. Par conséquent, le thread peut ne pas s'exécuter jusqu'à un certain temps après la fin de l'intervalle de sommeil". Certes, je ne l'ai jamais vu se produire, mais en même temps, s'il est documenté comme étant possible, je ne compterais certainement pas sur le fait qu'il ne se produise jamais.
Maximus Minimus

1
Il convient de mentionner que je pense que cela se rapporterait à "... si vous vouliez réduire l'utilisation du processeur ...": nanobit.net/doxy/quake3/win__main_8c-source.html <- le code pertinent commence à 01224
user_123abc

16

Réponse courte: non, ce n'est pas le cas.

Pour avoir une fréquence d'images fixe, vous devez appeler une certaine fonction de rappel qui force une fréquence d'images spécifique. De toute évidence, si vous ne savez pas combien de temps prendra une seule itération dans une boucle, vous ne pouvez pas définir un temps de sommeil fixe.

GLUT fournit glutTimerFunc () , qui est, si vous programmez en OpenGL, la bonne fonction dont vous avez besoin. Jetez un oeil à cet exemple , ou celui- ci.


1
"Après au moins msec millisecondes, OpenGLUT rappellera" - en quoi est-ce différent de Sleep?
Kromster dit soutenir Monica le
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.