我刚刚进行了几项测试,比较了加载/创建场景的不同方式的性能,以查看性能影响。测试只是渲染32x32网格的立方体,并注意CPU使用率,内存,能量和渲染时间。不是很科学,但有一些明确的结果。这四项测试包括......
.dae
,例如SCNScene(named: "grid.dae")
我预计1& 2大致相同,他们是。
我预计测试3的性能要好于测试1& 2,它做到了。 CPU负载和能源使用率非常低。它有一半的内存foootprint,渲染时间只是测试1&2的渲染时间的一小部分。
我希望测试4与测试3匹配,但事实并非如此。它似乎与测试1& 2相同或更差。
// Code for test 4
let boxPath = Bundle.main.path(forResource: "box", ofType: "scn")
let boxUrl = URL(fileURLWithPath: boxPath!)
let offset: Int = 16
for xIndex:Int in 0...32 {
for yIndex:Int in 0...32 {
let boxReference = SCNReferenceNode(url: boxUrl)
scene.rootNode.addChildNode(boxReference!)
boxReference?.position.x = Float(xIndex - offset)
boxReference?.position.y = Float(yIndex - offset)
boxReference?.load()
}
}
SceneKit的关卡编辑器为开发人员提供的性能优势是否可用,或者我只是错了,或者是Scenekit / XCode做了一些定制的事情?
更新
在回应Confused的评论时,我尝试在SCNNode上使用flattenedCone
方法。以下是使用该技术的原始代码的变体......
let boxPath = Bundle.main.path(forResource: "box", ofType: "scn")
let boxUrl = URL(fileURLWithPath: boxPath!)
let offset: Int = 16
let testNode = SCNNode()
for xIndex:Int in 0...32 {
for yIndex:Int in 0...32 {
let boxReference = SCNReferenceNode(url: boxUrl)
testNode.addChildNode(boxReference!)
boxReference?.position.x = Float(xIndex - offset)
boxReference?.position.y = Float(yIndex - offset)
boxReference?.load()
}
}
let optimizedNode = testNode.flattenedClone()
scene.rootNode.addChildNode(optimizedNode)