如果我将以下循环作为我的OpenGL程序的一部分运行:
void Loop(int state)
{
glutPostRedisplay();
glutTimerFunc(1, Loop, 0);
}
然后,我的程序运行正常,我可以通过拖动鼠标在场景中移动相机。
但是,如果我使用这个循环:
void Loop(int state)
{
glutPostRedisplay();
Loop();
}
我无法用鼠标在场景中移动。正在调用循环,但它不处理任何鼠标或键盘输入。
我不明白为什么会这样。唯一的区别是,在第一个示例中,使用计时器函数来调用Loop()
,而在第二个示例中,显式调用Loop()
,没有任何延迟。
那么glutTimerFunc()
实际上做了什么,除了调用Loop()
?
答案 0 :(得分:3)
在第一个示例中,glutTimerFunc
确保在1毫秒后调用Loop
,但它返回并且不等待,这意味着Loop
返回几乎立即。
在第二个例子中,Loop
正在调用自身,导致无限递归并锁定程序的主线程,这可以解释为什么在这种情况下什么都不起作用。那么,Loop
永远不会回来。如果你让你的程序运行得足够长,那么由于无限递归,你的系统将会耗尽内存。