gpt4 book ai didi

swift - removeFromParentNode 不释放 ARKit 应用程序中的内存

转载 作者:行者123 更新时间:2023-11-28 06:11:05 26 4
gpt4 key购买 nike

你好,我是 SceneKit 和 ARKit 的新手,所以这可能是一个基本问题。在我的 ARKit 应用程序中,我试图从一个点向一个方向连续发射一些火箭。因此我写了这个函数:

@objc func shootRocket() {
guard let cameraTransform = session.currentFrame?.camera.transform else {
return
}

let rocket = VirtualObject(definition: VirtualObjectManager.availableObjects[VirtualObjectManager.availableObjects.count - 1])

let rocket_pos = float3(x: position.x, y: position.y+0.144, z: position.z-0.66)
virtualObjectManager.loadVirtualObject(rocket, to: rocket_pos, cameraTransform: cameraTransform)

if rocket.parent == nil {
serialQueue.async {
self.sceneView.scene.rootNode.addChildNode(rocket)
let moveaction = SCNAction.move(by: SCNVector3(0,0,-10), duration: 5)
rocket.runAction(moveaction) {
rocket.removeAllActions()
rocket.removeAllAnimations()
rocket.removeFromParentNode()
}
}
}

}

我这样调用这个函数:

    if object.parent == nil {
serialQueue.async {
self.sceneView.scene.rootNode.addChildNode(object)
}
let timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.shootRocket), userInfo: nil, repeats: true)
...
}

一切正常,除了每次拍摄后我的内存使用量越来越大,几次拍摄后应用程序崩溃。

虽然函数 removeFromParentNode() 在被调用时释放了一些内存,但它看起来不像。

那么这里有什么问题呢?

最佳答案

我遇到了和你一样的问题。基本上你应该做的是覆盖你的虚拟对象类中的 dealloc/deinit 函数,并在这个函数中,枚举你的虚拟对象的所有子节点并将它们从它们的父节点中删除。

应该看起来像这样:

deinit {
enumerateChildNodes({(_ child: SCNNode, _ stop: Bool) -> Void in
child.removeFromParentNode()
})
print("Object Deallocated =)")
}

关于swift - removeFromParentNode 不释放 ARKit 应用程序中的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46573318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com