我开发自己的游戏引擎是为了娱乐(但不是赢利)。我在一个线程中渲染,而我的场景图在另一个线程中更新(速度等)。当需要渲染时,渲染线程将可见节点添加到新的线性缓冲区中并遍历它们。
更详细地讲,我的场景图是三重缓冲的。我的场景图中的每个节点都有其相对和绝对转换矩阵(4x4)的三个副本。在任何给定时间,场景图线程都将写入一个副本,渲染器将读取一个副本,而第三个副本则存在,以便读取器或写入器可以继续移动到下一个,而无需等待另一个。这样可以防止在渲染时写东西,也不会渲染半更新的场景图。不知何故,我还获得了每个矩阵的第四份副本供用户使用,以免与更新线程冲突。通过避免始终保持同步,这似乎表现良好。
但是,这是一团糟。
这些是系统的最终目标:
- 渲染和场景图更新位于单独的线程中。
- 最小化这些线程必须等待的时间。
- 不要渲染已被更新线程中途更新的场景。如果相机快速移动并且有时是在更新之前或之后渲染的,则这一点尤其明显。
- 减少内存使用。我每个节点的矩阵太多。由于矩阵的浮点漂移增加,因此我也正在考虑移至矢量进行位置/旋转/缩放。
- 能够处理数万个节点。当前的系统可以做到这一点。
我也希望将来能结合Bullet(物理引擎)和网络,但我都没有考虑太多。
完成更好的场景图有哪些方法?