有没有办法判断OpenGL操作是否完成?

时间:2013-08-13 19:43:09

标签: opengl asynchronous

定义OpenGL函数,就好像它们同步运行一样。但渲染函数(和其他函数)通常由GPU异步执行。 OpenGL会有效地隐藏这一点:如果你做了一些需要操作结果的事情(例如从已经渲染到的帧缓冲区中读取),OpenGL将停止CPU操作,直到GPU达到这一点。

这是功能性的,但对性能来说并不理想,因为CPU基本上会阻塞,直到GPU完成。有没有办法确定特定操作是否已完成,以便您知道在没有太多CPU阻塞的情况下执行相关操作?

1 个答案:

答案 0 :(得分:7)

是的,有。假设您可以访问OpenGL 3.2+或ARB_sync扩展。

如果您想知道特定命令何时完成,可以在发出该命令后立即在命令流中插入“fence”sync object。这是通过glFenceSync function完成的。

您必须存储此函数返回的指针。使用该指针,您可以通过检查是否使用glGetSync function发出栅栏信号来查询栅栏是否已完成。像这样:

GLint isSignaled = 0;
glGetSync(syncObj, GL_SYNC_STATUS, 1, NULL, &isSignaled);

if(isSignaled == GL_SIGNALED)
{
  //Prior commands have completed.
}
else
{
  //Not done yet.
}

如果你没有其他事情要做,你不需要等待同步对象完成;你可以做任何你想做的OpenGL过程。这将导致你的CPU阻塞。

完成同步对象后,必须将其删除。使用glDeleteSync function执行此操作。

相关问题