9

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

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

4

1 回答 1

8

就在这里。假设您可以访问 OpenGL 3.2+ 或 ARB_sync 扩展。

如果您想知道特定命令何时完成,您可以在发出该命令后立即将“栅栏”同步对象插入命令流。这是通过glFenceSync函数完成的。

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

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功能来做到这一点。

于 2013-08-13T19:43:09.207 回答