如何以编程方式获得Scenekit级别编辑器的优势

时间:2016-10-02 16:19:00

标签: swift scenekit

我刚刚进行了几项测试,比较了加载/创建场景的不同方式的性能,以查看性能影响。测试只是渲染32x32网格的立方体,并注意CPU使用率,内存,能量和渲染时间。不是很科学,但有一些明确的结果。这四项测试包括......

  1. 加载.dae,例如SCNScene(named: "grid.dae")
  2. 在XCode中将.dae转换为.scn文件并加载
  3. 使用参考节点手动在Scnenekit编辑器中构建网格
  4. 使用SCNReference节点以编程方式构建网格(请参阅问题底部的代码)
  5. 我预计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)
    

0 个答案:

没有答案