【发布时间】: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