glutTimerFunc()实际上做了什么?

时间:2016-06-06 17:20:23

标签: opengl glut

如果我将以下循环作为我的OpenGL程序的一部分运行:

void Loop(int state)
{
    glutPostRedisplay();
    glutTimerFunc(1, Loop, 0);
}

然后,我的程序运行正常,我可以通过拖动鼠标在场景中移动相机。

但是,如果我使用这个循环:

void Loop(int state)
{
    glutPostRedisplay();
    Loop();
}

我无法用鼠标在场景中移动。正在调用循环,但它不处理任何鼠标或键盘输入。

我不明白为什么会这样。唯一的区别是,在第一个示例中,使用计时器函数来调用Loop(),而在第二个示例中,显式调用Loop(),没有任何延迟。

那么glutTimerFunc()实际上做了什么,除了调用Loop()

1 个答案:

答案 0 :(得分:3)

在第一个示例中,glutTimerFunc确保在1毫秒后调用Loop,但它返回并且不等待,这意味着Loop返回几乎立即。

在第二个例子中,Loop正在调用自身,导致无限递归并锁定程序的主线程,这可以解释为什么在这种情况下什么都不起作用。那么,Loop永远不会回来。如果你让你的程序运行得足够长,那么由于无限递归,你的系统将会耗尽内存。