微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 克隆节点时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中的错误吗?

谢谢

解决方法

如果我理解正确,您将原始节点保存在AssetLoader的rootNodes字典中,并返回rootNode func中的那些节点的克隆.

我的架构类似,我的问题如下:当我从场景树中删除克隆节点时,内存将不会被释放.那是你的问题吗?

我修复了这个问题,在我的单例中添加一个“unload”函数,以便在从场景树中删除克隆节点时使原始节点无效.这解决了我的记忆问题.

使用您的代码看起来像:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐