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

发布于 2018-07-06 00:50:57
好了,我解决了这个问题。詹姆斯·P是对的。所有5个物体都使用了不同的材质。
如果您对所有对象使用相同的材质,然后将其展平为单个节点,则绘制调用将从6减少到2。您可以自己运行以下命令来查看:https://drive.google.com/open?id=1En3tZ9QFTZPd2-xJwCA-0CMO3QWX8UZt
我向苹果提交了一个bug,他们证实了为什么draw调用没有减少的原因是因为有5种不同的材料。因此,结论是: SceneKit的表现符合预期。
https://stackoverflow.com/questions/50898979
复制相似问题