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

Chr*_*bek 10 c++ opengl video-streaming

我不清楚OpenGL规范中的Sync对象,是否使用glGetSynciv或者glClientWaitSync我想在不等待的情况下检查同步对象的信号.以下两个命令如何在行为和性能方面进行比较:

GLint syncStatus;
glGetSynciv(*sync, GL_SYNC_STATUS, sizeof(GLint), NULL, &syncStatus);
bool finished = syncStatus == GL_SIGNALED;
Run Code Online (Sandbox Code Playgroud)

VS

bool finished = glClientWaitSync(*sync, 0 /*flags*/, 0 /*timeout*/) == ALREADY_SIGNALED;
Run Code Online (Sandbox Code Playgroud)

问题的一些细节:

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

一些背景:

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

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

Mat*_*tth 4

引用红皮书的话,

void glGetSynciv(GLsync 同步,GLenum pname,GLsizei bufSize,GLsizei *长度,GLint *值);

检索同步对象的属性。sync 指定同步对象的句柄,从中读取pname指定的属性。bufSize是缓冲区的大小(以字节为单位),其地址在value中给出。lenght是整数变量的地址,该变量将接收写入的字节数

而对于glClientWaitSync

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

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

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

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

  • 重点是超时为 0 的 glClientSyncWait 与 glGetSynciv() 的比较。我的测试似乎表明 glClientWaitSync 在 NVIDIA 上速度更快。这让我很好奇 glGetSynciv() 是否还有更多缺点。 (2认同)