CPU瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法

CPU bottleneck; simple way to handle rendering of a 3D scene with many non static objects

我目前正在开发一个小型 3D 游戏(渲染)引擎。但是我在渲染器中遇到了一个问题。这是它目前的工作方式:

一方面,我有一个场景 graph/ECS 用于处理游戏中的所有场景对象。每个场景对象可以有一个父对象和 0 到 N 个子对象。我可以将组件附加到每个 SceneObject。组件可以是各种东西,例如可渲染的、灯光或相机。

另一方面,我的渲染器完全独立于我的场景层次结构。事实上,每次我在 SceneObject 上添加一个 "Renderable" 组件时,我的渲染器都会收到一个通知并创建它自己的可渲染表示(Mesh、BoundingBox 等)。我的渲染器不关心可渲染对象的父项或子项。

当我想在将可见对象放入 RenderQueue 之前检索可见对象时,就会出现我面临的问题。在渲染器端,所有可渲染对象都存储在一个 平面列表 中,要执行剔除操作,我需要循环遍历此列表。不幸的是,此列表包含我游戏的所有活动对象,我可能会非常 CPU 耗时

我想找到一种方法来在渲染器端实现一些高效的分区系统,我可以在其中轻松更新可渲染数据(位置、边界框)。

感谢您的帮助。

这是一道算法题:

它们有很多 space 分区算法,例如 KD-Tree, Oct-tree, VP-tree 和许多其他算法。

选择最适合您的算法取决于您要存储的对象(它们是凸的吗?)、它们的大小、您需要多久计算一次与它们的交集、它们是静态的、动态的位置、形状?

您需要弄清楚这一点,然后 select 找到最适合他们的算法。没有什么能阻止您在引擎中使用多个不同的树,以处理不同的 object/object 行为。

通常一个渲染引擎会使用至少两棵树,一棵用于静态信息 (通常会预先计算以获得最佳存储和 ray/intersection 性能),还有一个用于动态对象。

另外,根据你的物体是凸的还是凹的,以及光线相交的精度,你可能想把你的凹物体分成凸的部分(并且只与那些部分的边界框相交),看看V-HACD 作为凹形物体的预处理步骤。这允许将 ray/object 相交计算的数量限制为大盒子而不是许多表面。