【发布时间】:2015-10-23 00:27:04
【问题描述】:
我知道多线程 OpenGL 是一个微妙的话题,我不想在这里尝试从多个线程进行渲染。我也不会尝试创建多个上下文并与共享列表共享对象。我有一个单一的上下文,我只从主线程发出绘制命令和 gl 状态更改。
但是,我在每一帧中动态更新部分 VBO。我只写入 VBO,不需要在 CPU 端读取它。我使用 glMapBufferRange,因此我可以即时计算更改的数据,并且不需要额外的副本(由阻塞的 glBufferSubData 创建)。
它可以工作,现在我想对数据更新进行多线程处理(因为它需要以稳定的 90 fps 更新大量顶点)并使用持久映射的缓冲区(使用 GL_MAP_PERSISTENT_BIT)。这将需要在工作线程完成更新部分映射缓冲区时发出 glFlushMappedBufferRange。
可以在单独的线程上调用 glFlushMappedBufferRange 吗?不同线程操作的范围不重叠。这样做是否涉及开销或隐式同步?
【问题讨论】:
-
任何 OpenGL 调用都需要上下文。如果你想从中调用
glFlushMappedBufferRange(),你肯定需要为工作线程创建一个额外的上下文。 -
但是您可以将映射的指针传递给辅助线程,并在那里获得您想要的所有读/写乐趣。只需确保在主线程
glFlushMappedBufferRange()调用期间阻止辅助线程接触您正在刷新的范围即可。
标签: c++ multithreading opengl graphics vbo