2017-10-04 110 views
1

你好,即時消息非常新的與SceneKit和ARKit一起工作,所以也許它是一個基本問題。在我的ARKit應用程序中,我試圖從一個點向一個方向連續拍攝一些火箭。因此,我寫了這個功能:removeFromParentNode不釋放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()在被調用時釋放了一些內存,但看起來不像。

那麼這裏有什麼問題?

回答

1

我碰到了和你一樣的問題。基本上你應該做的是覆蓋虛擬對象類中的dealloc/deinit函數,並且在這個函數中枚舉虛擬對象的所有子節點並將它們從父節點中刪除。

更新:

應該是這個樣子:

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

請注意,我用了一個轉換器這樣做,因爲我的代碼是在Objective-C。我剛剛瞭解到,dealloc已經改變爲deinit。

相關問題