一.BuildAssetBundleOption.DisableWriteTypeTree
DisableWriteTypeTree的作用如下:
- 在Unity 5.x版本中,AssetBundle在制作时会默认写入TypeTree信息,这样做的好处是可以保证AssetBundle文件的向下兼容性,即高版本可以支持以前低版本制作的AssetBundle文件。
- 所以,如果开启DisableWriteTypeTree选项,则可能造成AssetBundle对Unity版本的兼容问题,虽然关闭TypeTree会使Bundle更小,但我们一般都不建议研发团队在制作AssetBundle文件时开启该选项。
1.内存占用大小对比:
对于同一个预制体EnableWriteTree和DisableWriteTypeTree其大小对比如下:
- 开启WrietTypeTree:
- 关闭WriteTypeTree:
- 两者相差16K左右。而其asetbundle只是一个简单的预制体:
- 结论一:关闭WriteTypeTree是可以很大一部分减少内存占用。
2.打出包体大小对比
LZMA格式下,大小差了3K。
- 结论2:DisableWriteTypeTree能够减小包体的大小。
二.AssetBundle粒度问题
测试中我们发现,对于一个简单的文本打成AssetBundle,其AssetBundle加载出来对应的序列化的信息也有15.4K。如下:
一个空的文本文件:
打成AssetBundle后加载出资源,观察Profiler下SerializedField下的序列化信息(不包含WriteTree)的大小17.2K,比文件本身打了很多。
为了减少冗余我们经常需要将资源的粒度约细越好,但是对于资源本身就很小,资源又特别多的文件,如多个文本配置、shader文件等 如果每个单独打包会造成上面序列化信息文件占用内存过大的问题。
- 结论3:对于小而细且多的资源最好打在一起,一次性加载出来。如shader、lua脚本材质球、粒子系统等。