单独线程中的场景图


12

我开发自己的游戏引擎是为了娱乐(但不是赢利)。我在一个线程中渲染,而我的场景图在另一个线程中更新(速度等)。当需要渲染时,渲染线程将可见节点添加到新的线性缓冲区中并遍历它们。

更详细地讲,我的场景图是三重缓冲的。我的场景图中的每个节点都有其相对和绝对转换矩阵(4x4)的三个副本。在任何给定时间,场景图线程都将写入一个副本,渲染器将读取一个副本,而第三个副本则存在,以便读取器或写入器可以继续移动到下一个,而无需等待另一个。这样可以防止在渲染时写东西,也不会渲染半更新的场景图。不知何故,我还获得了每个矩阵的第四份副本供用户使用,以免与更新线程冲突。通过避免始终保持同步,这似乎表现良好。

但是,这是一团糟。

这些是系统的最终目标:

  • 渲染和场景图更新位于单独的线程中。
  • 最小化这些线程必须等待的时间。
  • 不要渲染已被更新线程中途更新的场景。如果相机快速移动并且有时是在更新之前或之后渲染的,则这一点尤其明显。
  • 减少内存使用。我每个节点的矩阵太多。由于矩阵的浮点漂移增加,因此我也正在考虑移至矢量进行位置/旋转/缩放。
  • 能够处理数万个节点。当前的系统可以做到这一点。

我也希望将来能结合Bullet(物理引擎)和网络,但我都没有考虑太多。

完成更好的场景图有哪些方法?

Answers:


4

您是否阅读过约翰尼斯·史波(Johannes Spohr)关于“ Pace”及其渲染器的论文?它描述了所谓的“提交引擎” *并行渲染器,并且可能会给您一些想法。

这里是摘要页面(在德国),并在这里是直接链接到这是英文的PDF。

*:此链接也指向我最初听说该论文的文章。)

编辑:我以前只是略读此内容,而我只是再次看了一下……并意识到它确实掩盖了场景图的细节。我想我没有意识到他的设计有多正交。抱歉,如果不是特别有用。


1
这篇文章仍然对我来说很棘手:“理想情况下,应用程序甚至根本不知道有场景图,它应该只知道它必须通知数据模型更改的视图组件”。这启发了我一种新的思考方式:我不需要对整个场景进行三倍缓冲,只需要通过当前摄像机可见即可。我可以将剔除操作从渲染线程移动到场景图线程(当遇到相机时),并且在任何给定时间,可以将这三个缓冲区之一写入其中,而另一个则可以由渲染器读取。
EricP 2010年

1
您可能还检查出的文章中游戏引擎“摄像机为中心的发动机设计为多线程渲染”宝石1,以及相关的“与DirectX 9和DirectX 10实用并行渲染” - microsoft.com/downloads/en/...
Neverender

1
看起来像游戏引擎宝石1可以免费下载: books.google.com/...
EricP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.