Ghi*_*anc 5 memory-leaks scenekit swift
我有一个资源加载和缓存单例定义如下:
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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我用它来让我的场景建设更快.我正在从扩展创建资产:
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
}
}
Run Code Online (Sandbox Code Playgroud)
乐器说我在每次调用clone()时都会疯狂地泄漏内存.我试图在没有造成崩溃的情况下尽可能使用弱而无主,并且它不会改变任何东西.有人有线索吗?这是SceneKit中的错误吗?
谢谢
如果我理解正确的话,您可以将原始节点保留在 AssetLoader 的 rootNodes 字典中,并返回 rootNode 函数中的克隆。
我的架构类似,我的问题如下:当我从场景树中删除克隆节点时,内存不会被释放。这是你的问题吗?
我通过在单例中添加“卸载”函数来解决此问题,以便在从场景树中删除克隆节点时使原始节点无效。这解决了我的记忆问题。
你的代码看起来像这样:
func unloadRootNode(_ named: String) {
rootNodes.removeValue(forKey: named)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
272 次 |
最近记录: |