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

时间:2018-06-17 17:34:35

标签: scenekit

我试图通过减少绘制调用来优化我的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)

截图

app screenshot

1 个答案:

答案 0 :(得分:2)

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

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

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