【问题标题】:OpenGL multithreaded scene graph traversalOpenGL多线程场景图遍历
【发布时间】:2013-04-28 20:43:44
【问题描述】:

我正在寻求通过减少每次渲染调用之前的场景图遍历开销来提高性能。我对多线程软件设计不是很有经验,所以在阅读了关于多线程渲染的 couple 文章后,我不确定如何解决这个问题:

我的渲染引擎是完全确定性的,并根据传入的转换指令在每个新帧上按顺序渲染帧。我目前看到线程场景图更新例程如下所示:

-------------CPU-------------------------------- --|--------GPU--------|----帧数----|

更新第 0 帧变换(生成线程)| GL 渲染调用 |第 0 帧

更新第 1 帧变换(生成线程)| GL 渲染调用 |第一帧

更新第 2 帧变换(生成线程)| GL 渲染调用 |第 2 帧

...
.......

.......

在第一次绘制调用之前,我开始在单独的步骤中更新第一个(第 1 帧)帧并继续进行渲染调用。在该调用结束时,我启动新线程以更新第 2 帧,检查第 1 帧的线程是否为完成,如果为真,我调用下一个渲染调用。依此类推。 这就是我看到这种情况发生的方式。我有两个问题:

1.设计这种系统的方法是否正确(简单)?

2.由于场景图更新线程未与下一次渲染调用的开始同步完成更新,渲染循环停止的可能性有多大?

我知道这里的一些人会说这取决于特定的场景图树复杂性,但我想知道它在现实中通常如何进行以及这种设计的主要缺点是什么/

【问题讨论】:

  • 人们说这取决于复杂性,因为它确实取决于复杂性。没有“通常”的情况,因为它依赖的东西太多了。如果您尝试更新一个巨大而复杂的场景,那么您更有可能必须等待它完成更新才能进行绘制。但是,它(几乎)总是比简单地使用单线程方法更快,所以我想说这真的没关系。
  • 是的,我明白了,这是有道理的......

标签: multithreading opengl


【解决方案1】:

您可能知道,您不应该从多个线程渲染到一个通用的 OpenGL 可绘制对象,因为这会导致网络速度变慢。然而准备绘图,即框架设置是并行化的有效步骤。它总是归结为生成要绘制的对象的线性列表,以最大限度地提高吞吐量并生成正确的结果。

当然,实际的生成步骤取决于所使用的结构。但对于多线程设计,它通常归结为 map 和 reduce 类型的方法。创建和同步线程有一定的开销。幸运的是,像 OpenMP 这样的系统可以解决这些问题。我还建议您在前一帧的 SwapBuffers 等待期间执行帧设置阶段。

【讨论】:

  • 好吧,我没有 SwapBuffers,因为我在屏幕外使用自定义 FBO 进行所有操作,但我明白你的意思。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-09-19
  • 2015-06-16
  • 2012-09-17
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多