2017-10-04 4 views
1

Bonjour im très nouveau dans le travail avec SceneKit et ARKit alors c'est peut-être une question fondamentale. Dans mon application ARKit, j'essaie de tirer des roquettes continuellement d'un point à un autre. Par conséquent, j'ai écrit cette fonction:removeFromParentNode ne libère pas de mémoire dans ARKit Application

@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() 
      } 
     } 
    } 

} 

Et j'appelle cette fonction comme ceci:

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

Tout fonctionne, sauf que mon utilisation de la mémoire devient de plus en plus après chaque coup de feu et après quelques tire les accidents de l'application.

Je pense que la fonction removeFromParentNode() libère de la mémoire lorsqu'elle est appelée, mais elle ne ressemble pas.

Alors, quel est le problème ici?

Répondre

1

J'ai rencontré le même problème que vous. Fondamentalement, ce que vous devez faire est de remplacer la fonction dealloc/deinit dans votre classe Virtual Object, et dans cette fonction, énumérer tous les nœuds enfants de votre objet virtuel et les retirer de leur parentNode.

Mise à jour:

devrait ressembler à ceci:

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

Remarque, j'utilise un convertisseur pour faire comme mon code était en Objective-C. Je viens d'apprendre que le dealloc a été changé en deinit.