向场景添加大量自定义节点需要很长时间才能加载

时间:2016-08-14 11:03:53

标签: ios swift scenekit scnnode

我正在构建一个scenekit应用,但是我遇到了一些更精细的问题。我创建了一个scene,我正在为它添加自定义几何体,它可以正常运行,直到节点数达到100个为止。理想的情况是在场景中添加大量节点并且有更简洁的方法做到了吗?

    for i in 0..<modelArr!.count {
        let model = modelArr![i]

        let pos: [SCNVector3] = Parser.loadPosition(model)
        let norm:[SCNVector3] = Parser.loadNormals(model)
        let ind:[CInt] = Parser.loadIndices(model)

        let src = SCNGeometrySource(vertices: pos, count: pos.count)
        let norSrc = SCNGeometrySource(normals: norm, count: norm.count)

        //let indexData = NSData(bytes: ind, length: sizeof(CInt) * ind.count)
        let indexData = NSData(bytes: Array<CInt>(0..<CInt(ind.count)),
                               length: ind.count * sizeof(Float))

        let element = SCNGeometryElement(data: indexData,
                                         primitiveType: .Triangles,
                                         primitiveCount: pos.count / 3,
                                         bytesPerIndex: sizeof(Float))

        let geo = SCNGeometry(sources: [src, norSrc], elements: [element])
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.redColor()
        material.specular.contents = UIColor.whiteColor()

        let cubeNode = SCNNode(geometry: geo)
        cubeNode.geometry?.firstMaterial = material
        emptyNode.addChildNode(cubeNode)
    }
    scn.rootNode.addChildNode(emptyNode)        
}

我有大量的指数,法线和头寸。

1 个答案:

答案 0 :(得分:0)

您可以做的一件事是使用Grand Central Dispatch拆分负载,使用dispatch_apply(分配计算)和串行调度队列(用emptyNode更新每个新cubeNode可以找到这种方法的详尽解释(使用不同的问题空间,但仍然试图加快昂贵的操作)in this answer

在单独的实用程序中进行加载有很大帮助。创建场景后,将其存档。将该场景嵌入面向用户的程序中。取消归档场景要比从头创建场景快得多。