使用来自不同线程的 opengl-command

Posted

技术标签:

【中文标题】使用来自不同线程的 opengl-command【英文标题】:Use opengl-command from different thread 【发布时间】:2019-02-24 15:47:27 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

另一种方法是使用辅助 OpenGL 上下文,该上下文设置为共享主要 OpenGL 上下文数据。您可以在不同的线程中同时使两个上下文成为当前的。对于 OpenGL-3.x 核心版本,您可以将当前设置为没有可绘制对象的上下文。然后,您可以使用辅助上下文来加载新数据、映射缓冲区等。

【讨论】:

以上是关于使用来自不同线程的 opengl-command的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 和来自不同线程的输入

来自不同 vb 文件中的线程的 VB 网络更新 GUI

如何实时可视化来自不同线程的图像?

Qt 4.8:来自不同线程的两个信号和一个插槽之间的连接行为

PyQT和线程

在来自多个线程的阻塞套接字上使用 send()