OpenGL函数的定义就好像它们是同步运行的一样。但是渲染功能(和其他功能)通常会由GPU异步执行。 OpenGL将有效地隐藏这一点:如果您执行需要操作结果的操作(例如,从已渲染到的帧缓冲区中读取数据),则OpenGL将停止CPU操作,直到GPU达到该点为止。
这是功能性的,但对于性能而言却并非理想选择,因为CPU基本上会阻塞,直到GPU完成为止。有没有一种方法可以确定某个特定的操作是否已完成,从而使您知道在没有太多CPU阻塞的情况下将执行从属操作?
最佳答案
就在这里。假设您可以访问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可以做到这一点。
关于opengl - 有没有办法判断OpenGL操作是否完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217829/