Unity5 AssetBundle资源管理

最近在开发的过程中,断断续续的踩了很多的坑,这里记录一些经验或者心得。

1、打包使用LZ4格式,加载使用LoadFromFile,这个在之前的文章里面已经分享过了。 这个应该是兼顾内存、加载速度、包体大小的通用方案了。如果更加关注加载速度,可以考虑使用不压缩的assetbundle,自己使用zip压缩,然后解压到sd卡(外存)。不太推荐lzma的压缩格式,仅仅提高了20%左右的压缩比,但是内存和加载速度大大降低。

2、AssetBundle使用LoadFromFile,这一个操作并不太消耗内存,也并不消耗时间。大概可以理解为加载了一个配置(AssetBundle头)。如果AssetBundle里面包含了非常多的资源,那么可能会略微耗一点(配置变大了),但一般这种AssetBundle都会在游戏一开始就加载起来,所以也无所谓了。

3、由于上一点所述,为了简化代码,AssetBundle的加载可以不使用异步加载接口(LoadFromFileAsync),AssetBundle不允许重复加载,所以如果这里要做异步的话,就要维护好回调通知。如果已经处理好了,可以无视这一条,如果代码维护的比较混乱的话,可以考虑只在加载资源的时候使用异步接口(LoadAssetAsync),这样整个AssetBundle管理会简化很多。

4、加载资源要么使用不带扩展名的文件名,要么使用全路径。如果大量资源打到一个包内,则使用全路径,避免文件名冲突。如果一个资源一个包,或者一个文件夹一个包,则可以使用文件名。

5、加载的资源通过引用计数来进行管理,Sprite Material Audio等资源可以通过Resources.UnLoadAsset来进行释放,不过一般情况下不需要显示释放。  Prefab比较特殊,虽然可以DestroyImmediate显示释放,但是考虑到Prefab其实不怎么占用资源,所以一般也不用显示释放。但是如果代码中有成员变量引用到Prefab,则必须在不用的时候置空,否则会因为存在引用而不能被释放。

6、AssetBundle.UnLoad(true)可以直接释放资源,包括AssetBundle自身以及它加载出来的资源。当我们的资源管理比较清晰的时候可以通过这个接口来释放。比如我的地图图片资源可以在上层通过自己维护的引用计数来管理AssetBundle,当发现不需要这个包的时候,直接调用UnLoad(true)释放掉所有资源,不用担心它被其他实例引用到。

      AssetBundle.UnLoad(false)可以释放它自己,但是不释放它加载的资源。这个接口我反而不怎么常用了。因为AssetBundle本身不怎么占用资源,我们关键要释放的是它加载出来的资源。只释放它自身基本没有什么意义。

7、只要引用到Sprite等资源的GameObject全部被销毁了,且不存在代码变量的引用。那么这些资源就是未被使用的资源。可以使用Resources.UnloadUnusedAssets来释放这些资源,它相当于资源上的GC,但是要注意这个接口相当耗时间,一定要在合适的时机调用。(比如打开主要功能界面的一两秒中后,这个时候玩家尚未做任何操作,由于界面把游戏内容都屏蔽掉了,卡顿一下也不易察觉)

      此外,我们应该主动的释放掉确定不用的资源(使用Unload(true)),以减轻UnloadUnUsedAssets的压力。当需要释放的资源越多的时候,这个函数调用耗时就越多。

8、GameObject是我们直接管理的游戏实体,这个维护好也相对容易。  Asset是游戏资源,通过引用计数来进行管理。 AssetBundle可以加载或者释放Asset。理清楚三者的关系就可以更好的管理好游戏资源。

9、关于实际游戏资源打包的建议。更多的从图集合并以及更新频率的角度去考虑。现在的AssetBundle已经足够好用,基本上是一个合格的资源包管理模块。理清楚上面几点内容,它也不存在什么大坑。甚至如果不从资源更新的角度去考虑,我会把所有的资源打到一个包里面。


你可能感兴趣的:(Unity3D开发)