2017-10-04 21 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

私はあなたと同じ問題に遭遇しました。基本的には、Virtual Objectクラスのdealloc/deinit関数をオーバーライドし、この関数内でVirtualオブジェクトのすべての子ノードを列挙し、それらをparentNodeから削除します。

更新:

は次のようになります。

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

注、私は私のコードをObjective-Cであったようにこれを行うには、コンバータを使用していました。私はdeallocがdeinitに変更されたことを知りました。

関連する問題