哪个用于OpenGL客户端等待:glGetSynciv与glClientWaitSync?

时间:2016-01-04 22:54:55

标签: c++ opengl video-streaming

我不清楚Sync objects上的OpenGL规范,是否要使用glGetSyncivglClientWaitSync以防我想要检查同步对象的信号而无需等待。以下两个命令如何在行为和性能方面进行比较:

GLint syncStatus;
glGetSynciv(*sync, GL_SYNC_STATUS, sizeof(GLint), NULL, &syncStatus);
bool finished = syncStatus == GL_SIGNALED;

VS

bool finished = glClientWaitSync(*sync, 0 /*flags*/, 0 /*timeout*/) == ALREADY_SIGNALED;

问题的一些细节:

  • glGetSynciv是否执行到GL服务器的往返?
  • 在驱动程序支持/错误方面是否有首选方法?
  • 是否有方法死锁或不立即返回?

某些背景信息:

  • 这适用于视频播放器,它将图像从物理源流式传输到GPU进行渲染。
  • 一个线程是流式/连续上传纹理,另一个线程在完成上传后呈现它们。每个渲染帧我们正在检查下一个纹理是否已完成上传。如果有,那么我们开始渲染这个新纹理,否则继续使用旧纹理。
  • 决定只是客户端,我不想等待,但很快就会继续呈现正确的纹理。

这两种方法都有人使用它们以便不等待的例子,但似乎没有人讨论使用其中一种的优点。

1 个答案:

答案 0 :(得分:2)

引用红皮书,

  

void glGetSynciv(GLsync sync,GLenum pname,GLsizei bufSize,GLsizei * lenght,GLint * values);

     

检索同步对象的属性。 sync指定 sync 对象的句柄,以读取 pname 指定的属性。 bufSize 是缓冲区的字节大小,其地址以 values 给出。 lenght 是一个整数变量的地址,它将接收写入值的字节数

适用于glClientWaitSync

  

GLenum glClientWaitSync(GLsync同步,GLbitfields标志,GLuint64超时);

     

使客户端等待 sync 对象发出信号。    glClientWaitSync()最多会等待 timeout 纳秒,以便在生成超时之前让对象发出信号。 flags 参数可用于控制命令的刷新行为。指定GL_SYNC_FLUSH_COMMANDS_BIT相当于在执行wait之前调用 glFlush()

因此,基本上 glGetSynciv()用于了解fence对象是否已发出信号, glClientWaitSync()用于等待fence对象发出信号。

如果您只想知道栅栏对象是否已发出信号,我建议使用 glGetSynciv()。 显然 glClientWaitSync() 需要更长的时间来执行 glGetSynciv(),但我猜测。 希望我能帮到你。