从不同的线程使用opengl-command

时间:2019-02-24 15:47:27

标签: c++ multithreading opengl

我有两个线程:一个用于3d渲染的主线程(opengl)和一个用于逻辑的线程。如果我想在渲染线程中创建盒子网格(如果顺序来自逻辑线程),应该如何连接线程?

在这种情况下,逻辑线程将使用opengl-commands,这是不可能的,因为每个opengl-command只应在主线程中执行。我知道我无法在不同线程上共享opengl上下文(这似乎是个坏主意),那么我应该如何解决此问题?是否存在某种通用设计模式或其他?谢谢。

2 个答案:

答案 0 :(得分:2)

您可以实现绘制命令队列。每个绘图命令都包含进行所需OpenGL调用所需的任何内容。渲染线程在每帧(原子上)清空队列并处理命令。任何其他线程都会准备自己的命令,并(在原子上)随时排队。

可以使用虚拟Draw方法将绘图命令实现为类层次结构。当然,这不是一个小小的改变,而且实施该系统的价格也不是那么小。

答案 1 :(得分:2)

有多种方法可以解决此问题。一种是使用逻辑线程作为命令生产者,而渲染线程作为消费者来实现命令队列。

另一种方法是利用辅助OpenGL上下文,该上下文被设置为共享主要OpenGL上下文数据。您可以在不同的线程中同时使这两个上下文成为最新。对于OpenGL-3.x及更高版本的内核,您可以将current作为上下文而不使用drawable。然后,您可以使用辅助上下文来加载新数据,映射缓冲区等。