我正在阅读OpenGL Superbible第4版。在第2章中,示例代码设置回调,后跟清除颜色,如下所示:
main()
{
//...
glDisplayFunc(RenderScene);
SetupRC();
//..
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
void SetupRC(void)
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
我们在这里有竞争条件,glClear
可能会在glClearColor
之前执行吗?
答案 0 :(得分:4)
这不是竞争条件,因为glutMainLoop()
在同一个线程中运行并且调用glDisplayFunc()
不会调用任何GL函数(它只保存指向回调的指针)。
来自文档:
glutMainLoop
进入GLUT事件处理循环。 在GLUT程序中,该程序最多应调用一次。 一旦被调用,该例程将永远不会返回。 它将根据需要调用已注册的任何回调
OpenGL只能渲染到在同一个线程中创建的GL上下文。因此,对glClearColor()
和RenderScene()
的调用将在同一个线程中调用。由于glutMainLoop()
稍后会调用main()
,glClearColor()
会在glClear()
RenderScene()
之前严格调用{{1}}。