微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 哪些用于OpenGL客户端等待:glGetSynciv与glClientWaitSync?

我从 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服务器的往返?
>在驱动程序支持/错误方面,是否有其他方法
>任何一种方法死锁或不能立即返回?

一些上下文:

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

这两种方法都有使用这些方法的人的例子,不是为了不等待,而是没有人会讨论使用一个或另一个的优点.

解决方法

引用红皮书,

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

Retrieves the properties of a sync object. sync specifies a handle to the sync object from wich to read the property specified by pname. bufSize is the size in bytes of the buffer whose address is given in values. lenght is the address of an integer variable that will receive the number of bytes written into values

而对于glClientWaitSync:

GLenum glClientWaitSync(GLsync sync,GLbitfields flags,gluint64 timeout);

Causes the client to wait for the sync object to become signaled.
glClientWaitSync() will wait at most timeout nanoseconds for the object to become signaled before generating a timeout. The flags parameter may be used to control flushing behavior of the command. Specifying GL_SYNC_FLUSH_COMMANDS_BIT is equivalent to calling glFlush() before executing wait.

因此,基本上glGetSynciv()用于知道fence对象是否已经被发出信号,并且glClientWaitSync()被用于等待fence对象已经发出信号.

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

原文地址:https://www.jb51.cc/c/113302.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐