将孩子添加到场景 ARKit/SceneKit 时 FPS 下降

Posted

技术标签:

【中文标题】将孩子添加到场景 ARKit/SceneKit 时 FPS 下降【英文标题】:FPS drop when adding child to a scene ARKit/SceneKit 【发布时间】:2018-07-02 16:53:40 【问题描述】:

我在一个 ARKit 项目上工作了 4 个月。 我注意到在我的场景 rootNode 中添加一个子节点时,会出现 FPS 下降。设备冻结不到一秒钟。 我做了很多研究和试验,注意到所有 Apple 的代码示例在放置对象时也会出现这种 FPS 下降。 节点是直接添加(scene.rootNode.addChild(child))还是在不同阶段(didUpdateAtTime、didApplyAnimations 等)添加到渲染器循环中都没有关系。 我发现一旦将一个对象添加到场景中,下一个添加的对象将立即渲染。我使用在 SceneKit 编辑器中创建的 3D 模型,克隆它以生成我的不同节点,然后将它们添加为子节点。我在放置对象之前执行此加载工作。

仪器显示渲染器循环在冻结期间处于忙碌状态。

我找到的唯一解决方案是在开始整个体验之前将我的节点添加到加载屏幕后面的场景中。

在使用节点之前渲染节点是游戏编程中的正常行为吗?

谢谢大家

【问题讨论】:

这里有同样的问题,你有没有找到任何实际的解决方案而不是简单的解决方法?我需要在 hitTest 之后添加模型:所以我无法预加载它 今天我没有找到任何其他方法来解决这个问题......我很确定 Apple 有一个我找不到的解决方案。 对象是在您 addChild 的那一刻还是在您使用 addChild 添加它之前实例化的?你有样品要提供吗? @OlegG。在我的例子中,对象已经被实例化了 在显示场景之前尝试在此场景中加载您需要的所有对象,然后重用您已经实例化的对象。 【参考方案1】:

随着 ARKit 3.0 及其附属版本的发布 - RealityKit(具有优化渲染引擎和改变场景层次结构的框架,它是用 Swift 编写的,因此它没有 Objective- C 绑定),一个丢帧,当添加一个孩子时,被减少到一个难以察觉的值

ARKit3/RealityKit 韧带的这种可预测行为对于采用 7 nm 工艺制造的处理器 A12 仿生和 A13 仿生(以及,当然,因为它们拥有上一代神经引擎和强大的 GPU)。

对于处理器性能较低的设备(A9、A10、A11),建议使用 3D 模型,每个模型的多边形总数不超过 10K,并使用 .blinn 或 @987654326 等常用着色器@(不是 PBR)。

我相信对于使用游戏引擎的游戏和应用来说,在使用它们之前首先将所有必要的游戏资产(如 3D 模型、纹理、声音文件等)加载(​​或缓存)到 RAM 中是一种很常见的做法。更多详情请阅读this articlethis article

不过,值得一提的是,与 VR 游戏不同,AR 游戏消耗的处理能力要大得多,因此需要仔细优化。所以,你是绝对正确的,在使用节点之前渲染节点,这是游戏编程中的正常行为。

【讨论】:

安迪,你太棒了,我正在用 RealityKit 制作游戏。是否可以直接与您联系以获得这样的小帮助? 嗨@Tanvirgeek,我很抱歉,但我不咨询。我的主要工作和次要工作都很忙。

以上是关于将孩子添加到场景 ARKit/SceneKit 时 FPS 下降的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity3d 中将游戏对象动态添加到场景中

Sprite Kit - 使用 Switch Case 将随机 Sprite 节点添加到场景中

在将对象添加到场景后如何更新宽度,高度? Three.PlaneGeometry(宽度,高度,1,1)

如何将图像后处理着色器的结果添加到场景中

如何将 3D 模型添加到场景中以使它们具有特定的 XYZ 位置?

ARKit + SceneKit:将重建场景用于物理?