【问题标题】:removing SCNNode does not free memory before creating new SCNNode在创建新的 SCNNode 之前删除 SCNNode 不会释放内存
【发布时间】:2022-01-10 15:13:26
【问题描述】:

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

【问题讨论】:

  • 你是如何诊断出内存没有被释放的?
  • 我的应用程序在收到内存警告后立即崩溃,所以我检查了调试器和仪器 >> 分配。加载场景时内存使用量上升,如果我清除屏幕但只有在之后没有加载新场景时才会减少。那有意义吗?我认为 ARC 持有 SCNNode 因为我正在重绘场景。
  • 嘿,保罗,你解决过这个问题吗?我目前有同样的问题。 stackoverflow.com/questions/35687122/…
  • @bpedit 是的,我在某处发现,如果您明确地为几何节点分配 nil 值,那么它会完全解除分配。因此,从场景节点中删除所有子节点后,添加类似这样的一行,self.geometryNode = nil
  • 我想我也必须通过枚举所有具有几何形状的孩子来做到这一点?谢谢,伯恩。

标签: ios swift memory scenekit scnnode


【解决方案1】:

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

以下是您如何实现它的示例:

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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2018-09-24
    • 2018-06-17
    • 1970-01-01
    • 2017-04-15
    • 2016-03-25
    • 2018-08-04
    • 2019-08-11
    相关资源
    最近更新 更多