glutTimerFunc problème
- Je utiliser Glut
pour faire une animation simple. Dans la fonction principale, glutTimerFunc(TIMERMSECS, animate, 0)
est appelé. Les deux morceaux de codes de générer le même graphique.
const int TIMERMSECS = 20;
float animation_time = 0;
const float animation_step = .5;
Méthode 1:
void animate(int t){
float time_elapsed = TIMERMSECS/1000.0;
float current_step = animation_step* time_elapsed;
glutTimerFunc(TIMERMSECS, animate, 0);
if(current_step < animation_step*2)
animation_time += current_step;
glutPostRedisplay();
}
Méthode 2:
void animate(int t){
float time_elapsed = TIMERMSECS/1000.0;
float current_step = animation_step* time_elapsed;
if(current_step < animation_step*2)
animation_time += current_step;
glutPostRedisplay();
glutTimerFunc(TIMERMSECS, animate, 0);
}
La seule différence entre eux est la position de glutTimerFunc
. Pour Method 1
, il ressemble à un récursif qui n'atteindra jamais la fin de animate()
fonction. Mais pourquoi cela fonctionne encore?
OriginalL'auteur Sean | 2011-08-26
Vous devez vous connecter pour publier un commentaire.
glutTimerFunc
ne immédiatement appeler la fonction de la minuterie en toutes circonstances. Même si le temps est de 0. Il attend toujours que le traitement du message en boucle, et même alors, il aura qu'à appeler la fonction demandée lorsque tous les autres message de la fin du traitement. De cette façon, les messages importants comme "repeindre la fenêtre" et "redimensionner la fenêtre" encore être traités.En général, vous ne devriez pas compter sur la fonction de minuterie d'être particulièrement précis.
glutTimerFunc
commence à compter le tempsTIMERMSECS
après avoir terminéglutPostRedisplay()
ouresize window
?Il peut. Il ne peut pas. Il n'est pas vraiment pertinent, puisque GLUT ne donne aucune garantie sur la précision de la fonction de minuterie est. Ce qui importe, c'est que la fenêtre de traitement de message sera toujours le cas, peu importe la façon dont de nombreuses fonctions de minuterie vous essayez de faire. Si glutPostRedisplay est partie de cela, je ne peux pas dire.
Merci, la position de
glutTimerFunc
affecter les résultats. Je veux dire de mettre cette fonction au début ou au milieu risque de produire les mêmes résultats?Pas de. C'est juste un marqueur, utilisée pour permettre à la SURSATURATION de la boucle de message qu'il doit faire certaines calendrier choses quand il manque de vrais messages à traiter. Traitement des messages d' pas filetée ou asynchrone.
OriginalL'auteur Nicol Bolas