你好,我在使用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()在被调用时释放了一些内存,但它看起来不像。
那么这里有什么问题?
答案 0 :(得分:1)
我遇到了和你一样的问题。基本上你应该做的是覆盖虚拟对象类中的dealloc / deinit函数,并在此函数内枚举虚拟对象的所有子节点,并将它们从parentNode中删除。
更新
应该是这样的:
deinit {
enumerateChildNodes({(_ child: SCNNode, _ stop: Bool) -> Void in
child.removeFromParentNode()
})
print("Object Deallocated =)")
}
注意,我使用转换器来执行此操作,因为我的代码是在objective-c中。我刚刚得知dealloc已被改为deinit。