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

标签 c++ multithreading opengl

如果我计划在 OpenGL 中使用多线程,我是否应该为每个上下文设置单独的缓冲区(来自 glGenBuffers)?

我还不太了解 OpenGL 多线程(目前我在“单”线程中工作)。我需要知道我是否可以共享已经推送到视频内存的缓冲区(使用 glBufferData/glBufferSubData),或者我必须为另一个线程保留缓冲区的拷贝。

最佳答案

您不想在多个线程中使用多个上下文。你真的不知道。

虽然这听起来是个好主意,但在实践中,多上下文多线程很复杂、麻烦,并且在驱动程序方面的支持很差,而且它只能略微提高(甚至可能降低!)性能。

真正想要的是只有一个线程与 OpenGL 对话(显然是一个上下文),映射一个缓冲区,并将内存指针传递给另一个线程,最好使用 3 个缓冲区(3 3 倍大小缓冲区的子缓冲区)与 immutable storage and persistent mapping ,如果可用的话。
那,并进行间接渲染调用,其中第二个线程提供间接调用从中读取的缓冲区。

有关持久映射主题的更多信息:请参阅本 GDC2014 presentation 的特别幻灯片 22-25 ,这基本上是 Cass Everitt 2013 年 SIGGRAPH 演讲的翻版。
另见 Everitt 的原始演讲:Beyond porting .

关于c++ - OpenGL 多线程/共享上下文和 glGenBuffers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23765371/

相关文章:

java - Java中如何一次停止多个线程中的每个线程?

Java n 线程更新值

c++ - 二维数组在 glUniformMatrix4fv、C++ 中工作吗?

c++ - 将 glRotate 和 glTranslate 与碰撞检测结合使用

c++ - 新版本的 g++ 的多线程性能下降?

java - 静态同步方法中的 ConcurrentModificationError

c++ - 在运行时以 C/C++ (JIT) 加载和链接 obj 文件

c++ - 如何在运行时检测默认 GPU?

c++ - 无法使用 Eigen 库编译 ChibiOS

c++ - 这段代码有什么未优化的地方?