swift – 克隆节点时SceneKit泄漏
发布时间:2020-12-14 04:57:54 所属栏目:百科 来源:网络整理
导读:我有一个资源加载和缓存单例定义如下: class AssetLoader { fileprivate var rootNodes = DictionaryString,SCNNode() static let sharedInstance = AssetLoader() fileprivate init() { } func rootNode(_ named: String) - SCNNode { if self.rootNodes[n
我有一个资源加载和缓存单例定义如下:
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中的错误吗? 谢谢 解决方法
如果我理解正确,您将原始节点保存在AssetLoader的rootNodes字典中,并返回rootNode func中的那些节点的克隆.
我的架构类似,我的问题如下:当我从场景树中删除克隆节点时,内存将不会被释放.那是你的问题吗? 我修复了这个问题,在我的单例中添加了一个“unload”函数,以便在从场景树中删除克隆节点时使原始节点无效.这解决了我的记忆问题. 使用您的代码看起来像: func unloadRootNode(_ named: String) { rootNodes.removeValue(forKey: named) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |