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

标签 opengl asynchronous

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/

相关文章:

c++ - 用线程生成问题世界

c++ - 使用 C++ opengl 的贝塞尔曲线

Javascript 更改 window.location 并运行异步 ajax get

c++ - OpenGL 从 4*float 格式上传像素数据 (C++)

c++ - Windows/opengl glext.h 构建问题

c++ - 设置基本着色器程序 - GLchar 和 file_contents 未定义?

web-services - 实现异步 Web API

c# - 如何从异步返回字符串

javascript - 使用异步 chrome.cookies.getAll 的结果

java - 在 GWT 异步方法中传递异常的正确方法是什么?