Scenekit SCNNode.FlattedClone()不会减少绘制调用

Scenekit SCNNode.FlattedClone()不会减少绘制调用,scenekit,Scenekit,我正试图通过减少抽签次数来优化我的SceneKit应用程序。从和许多WWDC对话中,通过FlattedClone()将多个子节点合并到单个节点应该可以减少draw调用,但我无法通过使用此方法来减少draw调用 我附上了一个简单的SceneKit应用程序示例,演示了FlattedClone如何不减少draw调用 当应用程序启动时,将显示5个对象,您可以看到5个绘图调用。(好吧,如果你和摄像机互动的话,实际上是6) 然后,如果按下切换按钮,5个节点将被展平为单个节点。这仍然会导致5次抽签 这似乎与所

我正试图通过减少抽签次数来优化我的SceneKit应用程序。从和许多WWDC对话中,通过FlattedClone()将多个子节点合并到单个节点应该可以减少draw调用,但我无法通过使用此方法来减少draw调用

我附上了一个简单的SceneKit应用程序示例,演示了FlattedClone如何不减少draw调用

当应用程序启动时,将显示5个对象,您可以看到5个绘图调用。(好吧,如果你和摄像机互动的话,实际上是6)

然后,如果按下切换按钮,5个节点将被展平为单个节点。这仍然会导致5次抽签

这似乎与所有关于FlattedClone的文档和讨论完全矛盾。你知道发生了什么事吗

您可以在模拟器或iOS设备中在此运行简单应用程序: 请注意,您需要晃动相机以更新draw调用统计信息

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)
截图
好的,我解决了这个问题。詹姆斯P是正确的。所有5个对象都使用了不同的材质

如果对所有对象使用相同的材质,然后展平为单个节点,则绘制调用将从6减少到2。您可以自己运行此命令以查看:


我向苹果提交了一个bug,他们确认抽签请求没有减少的原因是因为5种不同的材料。因此,总而言之:SceneKit的行为符合预期。

不完全确定,但我认为这是因为您的每个子节点都有不同的材质。如果他们都共享相同的材料,抽签调用的数量就会减少。即使共享相同的材料,我也会遇到同样的问题。我也是如此,但我的材料的内容是
CALayer
s,显然这很重要: