【问题标题】:How can I save CPU effort in SceneKit rendering delegates?如何在 SceneKit 渲染委托中节省 CPU 工作量?
【发布时间】:2017-08-05 12:32:15
【问题描述】:

SceneKit 每秒调用其渲染代理 60 次,以允许主机应用程序调整包含场景中的参数以提供动画、物理等。

我的场景很大(360,000 个顶点)。几乎所有 (~95%) 场景每分钟(每 3,600 个委托调用)都会稍微旋转一次。场景的一小部分(大约 300 个节点 ~ 15,000 个顶点)每秒移动一次(每 60 个委托调用);在应用程序“启动”(viewDidLoad)之前创建所有节点并设置它们的属性,然后在委托调用中仅更改它们的位置,如上所述。

根据 Xcode,我的帧刷新率仅保持在 60 fps,CPU 使用率约为 30%。所有这些努力都花费在渲染循环中(没有交互;没有其他工作)所以我有两个问题:

1) 考虑到我的应用程序的一般描述,30% 的 CPU 似乎合理吗?更具体地说,由于我的委托代码看起来很简单,并且从

2) 如果是这样,是否有任何 SceneKit 技巧来夺回一些 CPU?例如,是否可以减慢代理调用率?

这是在 2.8GHz/i7 2015 MacBook Pro 上使用 macOS 10.12.3 和 Xcode 8 (Swift 3)

【问题讨论】:

    标签: macos scenekit energy


    【解决方案1】:

    尝试使用flattenedClone 将节点及其子节点展平如何。

    【讨论】:

    • 我实际上没有很多节点(大约 400 个),一个节点是一个非常详细的线几何图形,大约有 350,000 个顶点[所以它已经像我'扁平'它]。例如,将其分解为 3,500 个顶点的 100 个节点会更有效吗[鉴于flattenedClone 的描述表明节点越少越好,我猜不是]。我觉得我在这里对 SceneKit 进行逆向工程!
    【解决方案2】:

    为您的几何创建SCNLevelOfDetail 对象值得一试。

    还有什么在动吗?能不能把你的view的preferredFramesPerSecond减少一下?

    【讨论】:

    • 我会看看SCNLevelOfDetail .. 对我来说是新的。 preferredFramesPerSecond 变量仅适用于 >macOS 10.12(但在那里效果很好)。一个新发现是渲染循环几乎把所有时间都花在了“Metal Flush”中......
    • 我还没有从场景中移动相机距离,所以 SCNLevelOfDetail 现在没有帮助。
    • 你试过了吗?几乎可以肯定,您在场景中放置的顶点数量超过了像素数量,因此减少该数量(使用 LOD)将减少您正在渲染的内容量。
    • 还没有,哈尔,构建一个低分辨率模型需要一些时间。我必须承认我并没有努力减少我让 GPU 去做的工作,因为我听说过它们有多么强大。例如,我让 GPU 完成所有隐藏顶点/线移除的工作。我想我的问题的核心部分是,“我期望太多了吗?”
    • "还有什么东西在动吗?" .. 不,~95% 是静态的。对preferredFramesPerSecond 进行一些试验表明 CPU 使用率较低(良好),但帧速率是通用的并且会影响所有渲染,因此,例如,移动相机 [通过 SCNView 中的swipeAction] 也会导致运动不稳定,因为较低的 fps 设置。 FWTW 在 60fps 时,相机运动、滑动非常流畅,对 CPU 使用率没有明显影响。如果以下陈述有意义,那么感觉 Apple 的“幕后”动作生成优于我通过委托调用生成的动作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多