根据OpenGL规范中的同步对象(Sync objects),我不清楚在不等待检查同步对象信号时是该使用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 进行渲染。
- 一个线程正在流式传输/连续上传纹理,另一个线程在完成上传后渲染它们。每个渲染帧都会检查下一个纹理是否已经上传完成。如果是,则开始渲染这个新纹理,否则继续使用旧纹理。
- 决策仅由客户端进行,我不想等待,而是快速继续渲染正确的纹理。
两种方法都有人使用它们来实现不等待的目的,但似乎没有讨论使用其中一种还是另一种的优点。
glWaitSync
(而不是Client
!),以及重新绑定对象,您可能看不到共享上下文中的更改。 参见规范§5.3.1 ... - peppe