我正在尝试使用并行化来提高绘制具有分层排序对象的 3D 场景的刷新率。场景绘制算法首先递归遍历对象树,并由此构建绘制场景所需的基本数据的有序数组。然后它多次遍历该数组以绘制对象/叠加层等。由于从我所读到的 OpenGL 不是线程安全的 API,我假设数组遍历/绘图代码必须在主线程上完成,但我我在想我可能能够并行化填充数组的递归函数。关键是数组必须按照对象在场景中出现的顺序填充,因此将给定对象与数组索引相关联的所有功能都必须以正确的顺序完成,但是一旦分配了数组索引,我就可以使用工作线程填充该数组元素的数据(这不一定是微不足道的操作)。所以这是我想要得到的伪代码。我希望您了解 xml-ish 线程语法。
recursivepopulatearray(theobject)
{
<main thread>
for each child of theobject
{
assign array index
<child thread(s)>
populate array element for child object
</child thread(s)>
recursivepopulatearray(childobject)
}
</main thread>
}
那么,是否可以使用 OpenMP 来做到这一点,如果可以,怎么做?是否有其他并行化库可以更好地处理这个问题?
附录:应Davide的要求,让我再详细解释一下。假设场景是这样排序的:
-Bicycle Frame
- Handle Bars
- Front Wheel
- Back Wheel
-Car Frame
- Front Left Wheel
- Front Right Wheel
- Back Left Wheel
- Back Right Wheel
现在,这些对象中的每一个都有很多与之相关的数据,即位置、旋转、大小、不同的绘图参数等。此外,我需要在这个场景上进行多次传递才能正确地绘制它。一个过程绘制对象的形状,另一个过程绘制描述对象的文本,另一个过程绘制对象之间的连接/关联(如果有的话)。无论如何,如果我必须多次访问这些不同的对象,从这些不同的对象中获取所有绘图数据非常慢,所以我决定使用一次将所有数据缓存到一维数组中,然后将所有实际的绘图通过只看数组。问题是,因为我需要以正确的顺序执行 OpenGL 推送/弹出,所以数组必须处于代表树层次结构的正确深度优先搜索顺序。在上面的例子中,
index 0: Bicycle Frame
index 1: Handle Bars
index 2: Front Wheel
index 3: Back Wheel
index 4: Car Frame
index 5: Front Left Wheel
index 6: Front Right Wheel
index 7: Back Left Wheel
index 8: Back Right Wheel
因此,数组的顺序必须正确序列化,但是一旦我正确分配了该顺序,我就可以并行化数组的填充。例如,一旦我将 Bicycle Frame 分配给索引 0 并将 Handle Bars 分配给索引 1,一个线程可以填充 Bicycle Frame 的数组元素,而另一个线程填充 Handle Bars 的数组元素。
好的,我想在澄清这一点时,我已经回答了我自己的问题,所以感谢 Davide。所以我发布了我自己的答案。