我不清楚Sync objects上的OpenGL规范,是否要使用glGetSynciv
或glClientWaitSync
以防我想要检查同步对象的信号而无需等待。以下两个命令如何在行为和性能方面进行比较:
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服务器的往返?某些背景信息:
这两种方法都有人使用它们以便不等待的例子,但似乎没有人讨论使用其中一种的优点。
答案 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(),但我猜测。 希望我能帮到你。