我有两条线索:一个主线程(opengl)用于3D渲染,一个线程用于逻辑。如果我想在渲染线程中创建一个长方体网格,我应该如何连接线程,如果顺序来自逻辑线程?在这种情况下,逻辑线程将使用opengl命令,这是不可能的,因为每个opengl命令都应该只在主线程中执行。我知道我不能在不同的线程上共享opengl上下文(这似乎是一个坏主意),那么我应该如何解决这个问题?是否存在一些通用的设计模式或其他东西?谢谢。
ruarlubt1#
你可以实现一个绘制命令队列。每个绘制命令都包含了调用OpenGL所需的任何内容。每一帧渲染线程都会清空当前队列并处理命令。任何其他线程都准备好自己的命令,并随时将它们加入下一帧的队列。非常原始的绘制命令可以通过虚拟Draw方法实现为类层次结构。当然,这不是一个小的变化,但现代引擎采用了这种方法,当然是更高级的版本。如果提交命令对象的子系统在下一帧中重用它们,这将是高效的。包括它们的缓冲器,所以每个子模块不断地准备和更新绘制命令,但是仅当基于某种逻辑应该呈现时才提交它。
Draw
dgenwo3n2#
有多种方法可以实现这一点,一种是实现一个命令队列,其中逻辑线程是命令生产者,渲染线程是消费者。另一种方法是使用辅助OpenGL上下文,该上下文被设置为共享主要OpenGL上下文数据。您可以在不同的线程中同时将两个上下文设置为当前上下文。对于OpenGL-3.x核心以上的版本,您可以将没有可绘制对象的上下文设置为当前上下文。然后,您可以使用辅助上下文加载新数据、Map缓冲区等。
2条答案
按热度按时间ruarlubt1#
你可以实现一个绘制命令队列。每个绘制命令都包含了调用OpenGL所需的任何内容。每一帧渲染线程都会清空当前队列并处理命令。任何其他线程都准备好自己的命令,并随时将它们加入下一帧的队列。
非常原始的绘制命令可以通过虚拟
Draw
方法实现为类层次结构。当然,这不是一个小的变化,但现代引擎采用了这种方法,当然是更高级的版本。如果提交命令对象的子系统在下一帧中重用它们,这将是高效的。包括它们的缓冲器,所以每个子模块不断地准备和更新绘制命令,但是仅当基于某种逻辑应该呈现时才提交它。dgenwo3n2#
有多种方法可以实现这一点,一种是实现一个命令队列,其中逻辑线程是命令生产者,渲染线程是消费者。
另一种方法是使用辅助OpenGL上下文,该上下文被设置为共享主要OpenGL上下文数据。您可以在不同的线程中同时将两个上下文设置为当前上下文。对于OpenGL-3.x核心以上的版本,您可以将没有可绘制对象的上下文设置为当前上下文。然后,您可以使用辅助上下文加载新数据、Map缓冲区等。