AsseBundle


一.ab 打包
  1. 压缩格式:选择 lz4(块压缩)
        好处:加载的时候,会分块加载,节约内存
        坏处:ab包体相对 流压缩 会大一些
  2. TypeTree 
        用来兼容不同版本的unity 是用ab包,用处不大,所以采用DisableWriteTypeTree选项,可以                        是ab包更小,占用内存更小,加载速度更快
  3. 打包颗粒
        类型分为ui图集,ui prefab,模型,音频等
        被引用少的,关联强的痛一个包,如:ui同一个界面的放在一个包,同一个模型相关的放在        一个包,所有的lua脚本放在一个包
  4. 打包后 输出一个 ab包 信息 的文件 ABManifest
        内容:记录 ab包的 大小,md5 吗,包含的asset资源路径等
        作用:用来热更和加载asset时能找到对应的ab包
  5. 打包后 输出一个 asset 依赖 ab包 的文件.    AssetsMap
        内容:包含 aaset 依赖的 所有 ab包
        作用:加载asset时,能找以来的ab 包
        具体解释:你可能会有疑问,已经有了 .manifest 记录 ab的依赖为什么还是自己 记录,这两个有区别,manifest文件记录的是 ab包和ab包之间的依赖关系,assetsmap 记录的是 asset和ab包之间的依赖关系。例如:A包中包含了两个asset,a1和a2,a1依赖了B包,a2依赖了C包,如果加载a1,用manifest去查找依赖,会把B,C都加载进内存,如果用assetsMap只会把B包加载进内存,节约内存占用。


二.资源加载和卸载
  1.  加载
        资源加载 对 ab,asset,实例化(instantiate)都进行了引用计数,避免频繁加载卸载造成cpu资源浪费。ab的引用计数 依赖于 asset引用,asset引用计数依赖于实例化。
  2. 卸载
        卸载分为三部分,ab 卸载,asset 卸载,和实例化销毁。
        ab卸载:有两种方式:
        unlaod(true):会把ab和ab加载出来的asset全部卸载掉,问题:A包中的a依赖了B中的b,a是一个预制体,b时一张图片,A包还没释放,B包用true释放会导致a引用的图片丢失。
unlaod(false):只会卸载ab,ab和加载出来的asset之间的关系会被断掉,问题:A包中的a和B包中的b依赖C包中的c,先加载了A中的a,依赖会把C中的c加载进来,现在用false 卸载A和C,ab包卸载掉了,但是asset还在内存中,当我们在加载B时,还是会加载C中的c出来,会导致内存中存在两份同样的c,就算此时用true去释放,第一次加载劲来的c也不会释放,导致内存泄漏。
针对上面两种方案,选择用true方式 释放,避免内存泄漏。解决true的释放问题,就是用引用计数,当ab包中的资源被使用一次,就++,只有被引用次数等于零的时候,才放入卸载池中,等待10秒后没有引用在卸载。
        aasset卸载 有两层的卸载:
        第一层:等 aaset 引用次数为零,ab引用次数也为零时,用unlaod(true)释放
        第二层:等 aaset 引用次数为零,用Resources.UnloadAsset(资源),只能释放基础类型,如texture,音频文件等,用这个释放的意义是,比如A包中有a1和a2,a1只有第一次引用了,之后一直不用了,但是a2一直被引用,会导致 ab包一只不能释放,也就导致a1一直存在内存中,导        致内存浪费


三.实例化销毁:
当实例化10秒后没有被引用,销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值