Open GL:多线程 glFlushMappedBufferRange?

Posted

技术标签:

【中文标题】Open GL:多线程 glFlushMappedBufferRange?【英文标题】:Open GL: multithreaded glFlushMappedBufferRange? 【发布时间】:2015-10-23 00:27:04 【问题描述】:

我知道多线程 OpenGL 是一个微妙的话题,我不想在这里尝试从多个线程进行渲染。我也不会尝试创建多个上下文并与共享列表共享对象。我有一个单一的上下文,我只从主线程发出绘制命令和 gl 状态更改。

但是,我在每一帧中动态更新部分 VBO。我只写入 VBO,不需要在 CPU 端读取它。我使用 glMapBufferRange,因此我可以即时计算更改的数据,并且不需要额外的副本(由阻塞的 glBufferSubData 创建)。

它可以工作,现在我想对数据更新进行多线程处理(因为它需要以稳定的 90 fps 更新大量顶点)并使用持久映射的缓冲区(使用 GL_MAP_PERSISTENT_BIT)。这将需要在工作线程完成更新部分映射缓冲区时发出 glFlushMappedBufferRange。

可以在单独的线程上调用 glFlushMappedBufferRange 吗?不同线程操作的范围不重叠。这样做是否涉及开销或隐式同步?

【问题讨论】:

任何 OpenGL 调用都需要上下文。如果你想从中调用glFlushMappedBufferRange(),你肯定需要为工作线程创建一个额外的上下文。 但是您可以将映射的指针传递给辅助线程,并在那里获得您想要的所有读/写乐趣。只需确保在主线程 glFlushMappedBufferRange() 调用期间阻止辅助线程接触您正在刷新的范围即可。 【参考方案1】:

不,您需要在执行 openGL 工作的线程中调用 glFlushMappedBufferRange

要克服这个问题,您有 2 个选择:

    获取 openGL 上下文并使其在工作线程中处于当前状态。这意味着 openGL 线程必须放弃上下文才能工作。

    将相关范围推入线程安全队列,让 openGL 线程从中弹出每个范围并调用glFlushMappedBufferRange

【讨论】:

以上是关于Open GL:多线程 glFlushMappedBufferRange?的主要内容,如果未能解决你的问题,请参考以下文章

open gl 到底是个啥东西啊

Open_GL 中的多边形材质

Android GL deadlock timeout error

Shiny Server Open Source 是不是支持多线程?

c_cpp play_open_gl.c

open.mapquestapi.com上的Progress 4GL GET请求