glutTimerFunc problem
Benutze ich Glut
um eine einfache animation. In der main-Funktion glutTimerFunc(TIMERMSECS, animate, 0)
genannt wird. Die beiden Teile des codes generieren, die gleiche Grafik.
const int TIMERMSECS = 20;
float animation_time = 0;
const float animation_step = .5;
Methode 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();
}
Methode 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);
}
Der einzige Unterschied zwischen Ihnen ist die position der glutTimerFunc
. Für Method 1
sieht es aus wie eine rekursive, dass wird nie erreichen das Ende animate()
Funktion. Aber warum heißt das immer noch funktionieren?
InformationsquelleAutor Sean | 2011-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
glutTimerFunc
wird nicht sofort rufen Sie die timer-Funktion unter keinen Umständen. Auch wenn die Zeit 0 ist. Es wartet immer auf die Verarbeitung der message loop, und selbst dann wird es nur rufen Sie die gewünschte Funktion, wenn alle anderen message-Verarbeitung abgeschlossen ist. So wichtige Nachrichten wie "repaint " Fenster" und "Fenster vergrößern" noch verarbeitet bekommen.Im Allgemeinen, Sie sollten sich nicht auf die timer-Funktion für besonders präzise.
glutTimerFunc
beginnt zu zählen, die ZeitTIMERMSECS
nach AbschlussglutPostRedisplay()
oderresize window
?Es kann. Es kann nicht. Es ist nicht wirklich relevant, da GLUT nicht machen irgendwelche Garantien auf, wie genau die timer-Funktion ist. Was zählt, ist, dass Fenster die message-Verarbeitung wird immer passieren, egal, wie viele timer-Funktionen Sie zu tun versuchen. Ob glutPostRedisplay ist Teil der, kann ich nicht sagen.
Danke, hat die postion von
glutTimerFunc
auf die Ergebnisse auswirken. Ich meine, die Umsetzung dieser Funktion am Anfang oder in der Mitte konnte erzeugen die gleichen Ergebnisse?Nein. Es ist nur eine Markierung, liess die GLUT der message-loop weiß, dass es tun sollten, einige timing-Sachen, wenn es ausgeführt wird aus der real-Nachrichten zu verarbeiten. Die Message-Verarbeitung ist nicht Gewinde-oder asynchron.
InformationsquelleAutor Nicol Bolas