2017-03-02 151 views
5

泄漏時,我有一個資產加載和緩存單定義爲這樣:SceneKit克隆一個節點

class AssetLoader { 
    fileprivate var rootNodes = Dictionary<String, SCNNode>() 

    static let sharedInstance = AssetLoader() 

    fileprivate init() { 
    } 

    func rootNode(_ named: String) -> SCNNode { 
     if self.rootNodes[named] != nil { 
      return self.rootNodes[named]!.clone() 
     } else { 
      let scene = SCNScene(named: "art.scnassets/\(named).scn") 
      self.rootNodes[named] = scene!.rootNode 
      return self.rootNodes[named]!.clone() 
     } 
    } 
} 

我使用它,使我的場景構建速度更快。我從分機創建資產如下:

extension CAAnimation { 
    class func animationWithScene(named: String) -> CAAnimation? { 
     unowned let rootNode = AssetLoader.sharedInstance.rootNode(named) 
     var animation: CAAnimation? 

     rootNode.enumerateChildNodes({ (child, stop) in 
      if child.animationKeys.count > 0 { 
       animation = child.animation(forKey: child.animationKeys.first!) 
       stop.initialize(to: true) 
      } 
     }) 
     return animation 
    } 
} 

extension SCNNode { 
    class func nodeWithScene(named: String) -> SCNNode? { 
     unowned let rootNode = AssetLoader.sharedInstance.rootNode(named) 
     let node = SCNNode() 

     for child in rootNode.childNodes { 
      node.addChildNode(child) 
     } 

     node.eulerAngles = SCNVector3(x: Float(-M_PI_2), y: 0, z: 0) 
     node.scale = SCNVector3Make(kMeshScale, kMeshScale, kMeshScale) 

     return node 
    } 
} 

儀器說我在每次調用clone()時都像瘋了一樣泄漏內存。我試圖在不引起崩潰的情況下儘可能使用弱和無主的方法,但它不會改變任何內容。任何人都有線索?這是一個在SceneKit中的錯誤?

感謝

+0

我有同樣的問題,你有沒有發現什麼是錯了嗎? –

回答

2

如果我理解正確的話你把你原來的節點在AssetLoader的rootNodes字典,並返回那些在根節點FUNC的克隆。

我的架構很相似,我的問題如下:當我從場景樹中刪除克隆節點時,內存不會被釋放。這是你的問題嗎?

我解決了這個問題,在從場景樹中刪除克隆節點時,通過在我的單例中添加「unload」func來使原始節點無效。這解決了我的記憶問題。

與您的代碼看起來是這樣的:

func unloadRootNode(_ named: String) { 
    rootNodes.removeValue(forKey: named) 
} 
+0

我不再爲此工作(從此改變了工作),但如果它解決了Florent的問題,我會標記爲已接受。看起來很有希望。 –