0

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

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

- - - - - - - 中央处理器 - - - - - - - - - - - - - - - - - - --|--------GPU--------|----帧数----|

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

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

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

………………
_

…………………………………………………………………………

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

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

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

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

4

1 回答 1

2

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

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

于 2013-04-29T10:23:59.677 回答