glutTimerFunc问题

glutTimerFunc问题,glut,Glut,我使用Glut制作一个简单的动画。在主函数中,调用glutTimerFunc(TIMERMSECS,animate,0)。这两段代码生成相同的图形 const int TIMERMSECS = 20; float animation_time = 0; const float animation_step = .5; 方法1: void animate(int t){ float time_elapsed = TIMERMSECS/1000.0; flo

我使用
Glut
制作一个简单的动画。在主函数中,调用
glutTimerFunc(TIMERMSECS,animate,0)
。这两段代码生成相同的图形

const int TIMERMSECS = 20;
float animation_time = 0;
const float  animation_step = .5;
方法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();
}
void动画(int t){
浮动时间=TIMERMSECS/1000.0;
浮动当前步=动画步*经过的时间;
glutTimerFunc(TIMERMSECS,动画,0);
如果(当前步骤<动画步骤*2)
动画时间+=当前步数;
再发现();
}
方法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);
}
void动画(int t){
浮动时间=TIMERMSECS/1000.0;
浮动当前步=动画步*经过的时间;
如果(当前步骤<动画步骤*2)
动画时间+=当前步数;
再发现();
glutTimerFunc(TIMERMSECS,动画,0);
}

它们之间唯一的区别是
glutTimerFunc
的位置。对于
方法1
,它看起来像一个永远不会到达
animate()
函数末尾的递归。但是为什么这仍然有效呢?

glutTimerFunc
在任何情况下都不会立即调用计时器函数。即使时间是0。它总是等待消息处理循环,即使如此,它也只会在所有其他消息处理完成后调用请求的函数。这样,像“重新绘制窗口”和“调整窗口大小”这样的重要消息仍然会得到处理


一般来说,您不应该依赖计时器功能的精确性。

您的意思是
glutTimerFunc
在完成
glutPostRedisplay()
调整窗口大小后开始计算时间
TIMERMSECS
。可能不会。这并不是真的相关,因为GLUT不能保证计时器函数的准确性。重要的是,无论您尝试执行多少个计时器函数,窗口消息处理总是会发生。我不能说glutPostRedisplay是否是其中的一部分。谢谢,
GLUTIMERFUNC
的位置会影响结果吗。我的意思是,将这个函数放在开头或中间可以产生相同的结果?@Sean:不。它只是一个标记,用来让GLUT的消息循环知道,当它没有真正的消息要处理时,它应该做一些计时工作。消息处理不是线程化或异步的。