OpenGL 函数被定义为好像它们是同步操作的。但是渲染函数(和其他函数)通常会由 GPU 异步执行。OpenGL 将有效地隐藏这一点:如果您执行需要操作结果的操作(例如从已渲染到的帧缓冲区中读取),OpenGL 将停止 CPU 操作,直到 GPU 达到该点。
这是功能性的,但对于性能来说并不理想,因为 CPU 基本上会阻塞,直到 GPU 完成。有没有办法确定某个特定操作是否已完成,以便您知道将在没有那么多 CPU 阻塞的情况下执行相关操作?
OpenGL 函数被定义为好像它们是同步操作的。但是渲染函数(和其他函数)通常会由 GPU 异步执行。OpenGL 将有效地隐藏这一点:如果您执行需要操作结果的操作(例如从已渲染到的帧缓冲区中读取),OpenGL 将停止 CPU 操作,直到 GPU 达到该点。
这是功能性的,但对于性能来说并不理想,因为 CPU 基本上会阻塞,直到 GPU 完成。有没有办法确定某个特定操作是否已完成,以便您知道将在没有那么多 CPU 阻塞的情况下执行相关操作?
就在这里。假设您可以访问 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
功能来做到这一点。