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

Which to use for OpenGL client side waiting: glGetSynciv vs. glClientWaitSync?

本文关键字:glGetSynciv glClientWaitSync 客户端 等待 OpenGL      更新时间:2023-10-16

根据OpenGL关于同步对象的规范,我不清楚是使用glGetSynciv还是glClientWaitSync,以防我想在不等待的情况下检查同步对象的信号。以下两个命令在行为和性能方面如何比较:

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

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

问题的一些细节:

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

一些上下文:

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

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

引用红皮书,

void glGetSynciv(GLsync sync、GLenum pname、GLsizei bufSize、GLsizei*lenght、GLint*值);

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

而对于glClientWaitSync:

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

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

因此,基本上,glGetSynciv()用于知道fence对象是否已发出信号,而glClientWaitSync()

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