我刚刚运行了一些测试,比较了加载/创建场景的不同方式的性能,以了解性能影响。该测试只是渲染一个 32x32 的立方体网格,并观察 CPU 使用率、内存、能源和渲染时间。不是很科学,但有一些明确的结果。这四项测试包括...
- Load a
.dae
, e.g. SCNScene(named: "grid.dae")
- 在 XCode 中将 .dae 转换为 .scn 文件并加载该文件
- 使用参考节点在 Scnenekit 编辑器中手动构建网格
- 使用 SCN 参考节点以编程方式构建网格(请参阅问题底部的代码)
我预计 1 和 2 会大致相同,结果确实如此。
我预计测试 3 的性能会比测试 1 和 2 好得多,而且确实如此。 CPU 负载和能源使用量非常低。它的内存占用只有测试 1 和 2 的一半,并且渲染时间只是测试 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 在幕后做了一些定制的事情?
UPDATE
为了回应 Confused 的评论,我尝试使用flattenedCone
SCNNode 上的方法。这是使用该技术的原始代码的变体......
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)
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)