【问题标题】:SCNNode.flattenedClone() does not reduce draw callsSCNNode.flattenedClone() 不会减少绘制调用
【发布时间】:2018-07-06 02:41:50
【问题描述】:

我正在尝试通过减少绘图调用来优化我的 SceneKit 应用。从Apple Documentation 和许多 WWDC 讨论来看,通过 flattenedClone() 将许多子节点组合成一个节点应该可以减少绘制调用,但我无法通过使用这种方法来减少绘制调用。

我附上了一个简单的 SceneKit 应用示例,它演示了 flattenedClone 如何没有减少绘制调用。

应用启动时,显示 5 个对象,您可以看到 5 个绘图调用。 (好吧,如果您与相机互动,实际上是 6 个)。

然后,如果您按下切换按钮,5 个节点将被展平为一个节点。这仍然会导致 5 个绘图调用!

这似乎与围绕 flattenedClone 的各种文档和讨论完全矛盾。对正在发生的事情有任何想法吗?

您可以在此处运行简单的应用程序,无论是在模拟器还是 iOS 设备中: https://drive.google.com/open?id=1ZJQZAnHtOCeK_3WzbdD0vLLJ2kWTKao- 请注意,您需要左右摆动相机才能更新绘制调用统计信息。

let nodes = SCNScene.init(named: 
"nodes.scn")!.rootNode.childNode(withName: "parentNode", recursively: true)!;

//Unflattened version:
scene.rootNode.addChildNode(nodes)

//Flattened version:
let flattenedNode = nodes.flattenedClone()
scene.rootNode.addChildNode(flattenedNode)

截图

【问题讨论】:

  • 不完全确定,但我认为这是因为您的每个子节点都有不同的材料。如果它们都共享相同的材质,则绘制调用的数量会减少。
  • 即使共享相同的材料,我也遇到了同样的问题。
  • 我也是——但我的材料内容是CALayers,显然这很重要:stackoverflow.com/questions/57693079/…

标签: scenekit


【解决方案1】:

好的,我解决了这个问题。詹姆斯 P 是正确的。所有 5 个对象都使用不同的材料。

如果您对所有对象使用相同的材​​质,然后将其展平为单个节点,则绘制调用从 6 次减少到 2 次。您可以自己运行查看:https://drive.google.com/open?id=1En3tZ9QFTZPd2-xJwCA-0CMO3QWX8UZt

我向 Apple 提交了一个错误,他们确认绘制调用没有减少的原因是因为 5 种不同的材料。因此,结论是:SceneKit 的行为符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多