5

我正在构建一个应用程序,它使用 Scenekit 根据从数据库返回的信息显示场景。我创建了一个带有类 func 的自定义类,该类创建一个 SCNNode,其中包含需要绘制的所有内容并将其返回给我的 SCNView。在调用此函数之前,我删除了所有现有节点。一切都很好,直到我需要第二次调用它。在移除旧的 SCNNode 之后,在创建新的之前不会释放内存。有没有一种标准方法可以在不超载内存的情况下删除和替换 SCNNode?我是 iOS 开发新手,之前也从未真正做过图形。谢谢

4

1 回答 1

11

我遇到了同样的问题,我的 SceneKit 应用程序泄漏了大量内存。SCNNode如果在让 Swift 取消初始化之前将其geometry属性设置为 ,则会释放 的内存。nil

这是一个如何实现它的示例:

class ViewController: UIViewController {
    @IBOutlet weak var sceneView: SCNView!
    var scene: SCNScene!

    // ...

    override func viewDidLoad() {
        super.viewDidLoad()
        scene = SCNScene()
        sceneView.scene = scene

        // ...
    }

    deinit {
        scene.rootNode.cleanup()
    }

    // ...
}

extension SCNNode {
    func cleanup() {
        for child in childNodes {
            child.cleanup()
        }
        geometry = nil
    }
}
于 2017-06-26T09:25:39.590 回答