OpenGL多线程/共享上下文和glGenBuffers

tow*_*120 2 c++ opengl multithreading

如果我计划在OpenGL中使用多线程,我应该为每个上下文分别使用缓冲区(来自glGenBuffers)吗?

我对OpenGL多线程还不太了解(现在我在"单一"线程中工作).我需要知道我是否可以共享已经推送到Video Memory的缓冲区(使用glBufferData/glBufferSubData),或者我必须保留另一个线程的缓冲区副本.

bvs*_*bvs 6

Vaos 不共享,因此您需要为每个上下文的每个对象生成一个新的 vao,否则在删除/创建新对象时,行为将变得不可预测和不正确。这可能是错误的主要来源。Vbos 可以共享,因此每个对象只需要一个 vbo。


Dam*_*mon 6

您不希望在多个线程中使用多个上下文.你真的没有.

虽然这听起来是个好主意,但在实践中,muli-context-multi-thread在驱动程序端是复杂,麻烦和严重支持的,并且它只是略微改善(甚至可能降低!)性能.

真正想要的是只有一个线程与OpenGL交谈(显然有一个上下文),映射缓冲区,并将内存指针传递给另一个线程,最好使用3个缓冲区(3个大小缓冲区的3个子缓冲区)和不可变存储和持久映射(如果可用).
那,并进行间接渲染调用,其中第二个线程提供间接调用读取的缓冲区.

关于持久映射主题的更多信息:特别参见本GDC2014演示文稿的幻灯片22-25 ,它基本上是Cass Everitt 2013年SIGGRAPH演讲的翻版.
另见Everitt最初的演讲:超越移植.

  • 嗯,实际上你没有。您使用的 _one_ 是 big_ 的 _三倍(实际上是 3 个缓冲区,但在一个缓冲区对象中)。您必须至少有两个缓冲区(或缓冲区“子区域”),因为您在 GPU 读取时写入,因此您必须小心不要在使用数据时踩踏数据。使用 3 个缓冲区而不是 2 个意味着您很可能永远不会(或很少)在围栏上阻塞,而如果您只使用 2 个,您几乎每次都会定期阻塞(浪费时间)。 (2认同)