一.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秒后没有被引用,销毁