OpenGL多线程场景图遍历

时间:2013-04-28 20:43:45

标签: multithreading opengl

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

我的渲染引擎是完全确定的,并且在每个新帧处以顺序方式呈现基于传入转换指令的帧。我目前看到线程场景图更新例程如下:

-------------- CPU -------------------------------- ----- | ------ GPU -------- | ----帧号---- |

更新第0帧变换(产生线程)| GL RenderCall |第0帧

更新第1帧变换(产生线程)| GL RenderCall |第1帧

更新第2帧变换(产生线程)| GL RenderCall |第2帧

...
.......

...............

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

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

2.渲染循环失速的可能性是什么,因为场景图更新线程没有与下一个渲染调用的开始同步完成更新?

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

1 个答案:

答案 0 :(得分:2)

正如您可能知道的那样,您不应该从多个线程渲染到常见的OpenGL drawable,因为这会导致净减速。但是准备绘图,即框架设置是一个有效的并行化步骤。它总是归结为生成一个线性的对象列表,以便最大化吞吐量并生成正确的结果。

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