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?的主要内容,如果未能解决你的问题,请参考以下文章
Android GL deadlock timeout error