我知道多线程OpenGL是一个微妙的主题,我不是在尝试从多个线程渲染。我也不会尝试创建多个上下文并与共享列表共享对象。我只有一个上下文,我只从主线程发出绘图命令和gl状态更改。
但是,我在每帧中动态更新部分VBO。我只写VBO,我不需要在CPU端读取它。我使用glMapBufferRange,因此我可以动态计算更改的数据,而不需要额外的副本(由阻塞glBufferSubData创建)。
它工作,现在我想多线程数据更新(因为它需要以稳定的90 fps更新很多顶点)并使用持久映射的缓冲区(使用GL_MAP_PERSISTENT_BIT)。每当工作线程完成更新映射缓冲区的部分时,都需要发出glFlushMappedBufferRange。
在单独的线程上调用glFlushMappedBufferRange可以吗?不同线程操作的范围不重叠。这样做是否涉及开销或隐式同步?
答案 0 :(得分:0)
不,你需要在执行openGL内容的线程中调用glFlushMappedBufferRange
。
要解决此问题,您有两个选择:
获取openGL上下文并使其在工作线程中保持最新状态。这意味着openGL线程必须放弃上下文才能工作。
将相关范围推送到线程安全队列中,让openGL线程从其中弹出每个范围并调用glFlushMappedBufferRange
。