使用来自不同线程的 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的主要内容,如果未能解决你的问题,请参考以下文章