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