glutTimerFunc() 实际上做了什么?
What does glutTimerFunc() actually do?
如果我 运行 以下循环作为我的 OpenGL 程序的一部分:
void Loop(int state)
{
glutPostRedisplay();
glutTimerFunc(1, Loop, 0);
}
然后,我的程序 运行 没问题,我可以通过拖动鼠标在场景中移动相机。
但是,如果我使用这个循环:
void Loop(int state)
{
glutPostRedisplay();
Loop();
}
我无法使用鼠标在场景中四处移动。正在调用循环,但它只是不处理任何鼠标或键盘输入。
我不明白这是为什么。唯一的区别是,在第一个示例中,使用定时器函数调用 Loop()
,而在第二个示例中,Loop()
被显式调用,没有任何延迟。
那么 glutTimerFunc()
除了调用 Loop()
之外实际上在做什么?
在第一个示例中,glutTimerFunc
确保 Loop
在 1 毫秒后调用,但是 returns 和 不会等待 ,这意味着Loop
在这种情况下 returns 几乎立即。
在第二个示例中,Loop
正在调用自身,这会导致无限递归并锁定程序的主线程,这可以解释为什么在这种情况下没有任何效果。 Loop
,那么,永远不会returns。如果您离开程序 运行ning 足够长的时间,您的系统将由于无限递归 运行 内存不足。
如果我 运行 以下循环作为我的 OpenGL 程序的一部分:
void Loop(int state)
{
glutPostRedisplay();
glutTimerFunc(1, Loop, 0);
}
然后,我的程序 运行 没问题,我可以通过拖动鼠标在场景中移动相机。
但是,如果我使用这个循环:
void Loop(int state)
{
glutPostRedisplay();
Loop();
}
我无法使用鼠标在场景中四处移动。正在调用循环,但它只是不处理任何鼠标或键盘输入。
我不明白这是为什么。唯一的区别是,在第一个示例中,使用定时器函数调用 Loop()
,而在第二个示例中,Loop()
被显式调用,没有任何延迟。
那么 glutTimerFunc()
除了调用 Loop()
之外实际上在做什么?
在第一个示例中,glutTimerFunc
确保 Loop
在 1 毫秒后调用,但是 returns 和 不会等待 ,这意味着Loop
在这种情况下 returns 几乎立即。
在第二个示例中,Loop
正在调用自身,这会导致无限递归并锁定程序的主线程,这可以解释为什么在这种情况下没有任何效果。 Loop
,那么,永远不会returns。如果您离开程序 运行ning 足够长的时间,您的系统将由于无限递归 运行 内存不足。