首先,简要介绍一下加载AssetBundle的主要两种方式,分别是new WWW(url)和WWW.LoadFromCacheOrDownload,两种方式的具体用法,自己查官方API,这里不再叙述
new WWW是单纯地把AssetBundle加载到内存
WWW.LoadFromCacheOrDownload是把AssetBundle写入到缓存中,然后在需要加载AssetBundle时,再从缓存中读取AssetBundle,达到一个加速效果,而且只在内存中保存一些必要的缓存指针信息,因此非常省内存,目前我在的公司都是用这种加载方式
这次主要是比较这两种方式的加载效率
测试结果:
1.在PC上,两种方式的效率,第一次只相差大约40%,可能PC端的硬盘有高速缓存和读写速度相对较快的原因,而在移动端,效率则相差2倍之多
2.第二种方式在二次读取时,速度很快
3.推荐使用第二种方式
总结:根据上面的比较,可以看出WWW.LoadFromCacheOrDownload虽然在第首次加载时,略慢于new WWW,但在之后的二次加载(如退出游戏程序,再次进入游戏,也算二次加载),WWW.LoadFromCacheOrDownload会带来更加快的加载速度和更加节约内存,即使是一百多兆的资源,全部加载完成,也大概只占不要10MB的内存,因为Unity给它们都做了硬盘缓存,开辟了大量的磁盘空间来换取消耗大量内存的代价。并且在加载完AssetBundle后,实例化的速度和new WWW的无任何差异。WWW.LoadFromCacheOrDownload完胜!
其他注意点:
- 使用WWW.LoadFromCacheOrDownload加载时,若磁盘空间已满并所有的缓存文件都在使用中,则WWW.LoadFromCacheOrDownload会调用new WWW()方式,把资源载入内存中。较好地解决了磁盘不足的情况
- 在缓存中,Unity进行资源识别的唯一方式是资源名称+版本号,因此无论是何种资源,资源名称不能相同
- 对缓存的所有操作都在Caching类中,仅提供简单的查询和清除操作