使用来自不同线程的OpenGL命令

Use opengl-command from different thread

本文关键字:线程 OpenGL 命令      更新时间:2023-10-16

我有两个线程:一个用于3D渲染的主线程(OpenGL),逻辑中一个线程。如果要在渲染线程中创建一个框架,如果订单来自逻辑线程,我应该如何连接线程?

在这种情况下,逻辑线程将使用OpenGL-Commands,这是不可能的,因为每个OpenGl-Command仅应在主线程中登记。我知道我无法通过不同的线程共享OpenGL上下文(这似乎是一个坏主意),那么我应该如何解决这个问题?是否存在某些通用设计模式或其他方式?谢谢。

您可以实现draw命令队列。每个绘制命令都包含进行所需的OpenGL调用所需的任何内容。每个帧渲染线程都清空当前队列并处理命令。任何其他线程都可以随时准备自己的命令,并在下一帧的队列中招募它们。

非常原始的绘制命令可以用虚拟Draw方法作为类层次结构实现。当然,这根本不是一个很小的变化,但是现代发动机采用了这种方法,当然更先进的版本。如果提交其命令对象的子系统在下一个帧(包括其缓冲区)重新使用它们,则可以有效。因此,每个子模块都会不断准备和更新Draw命令,但仅在应根据某些逻辑进行渲染时才提交。

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

另一种方法是利用辅助OpenGL上下文,该上下文是共享主要OpenGL上下文数据的设置。您可以在不同的线程中同时同时使用两个上下文。对于OpenGL-3.x核心,您可以将当前的上下文作为上下文,而无需绘制。然后,您可以使用辅助上下文来加载新数据,地图缓冲区等。