Unity5资源管理的又一次探讨

对于Unity来说,常用的资源管理有2种方式,一种是包内的Resources资源,一种是外部的AssetBundle加载。之前我在博客里面写了很多篇文章来介绍AssetBundle的使用方法和加载策略。按道理来说,这套东西暂时还用得挺好,不过有一个问题就是,打出去的assetbundle文件,不管你是打包成zip包放在安装包一起出去,然后第一次启动的时候解压缩,还是直接把assetbundle放到网上的cdn,然后用的时候才下载,都会让人感觉到有点不爽。
我自己的做法就是把assetbundle文件打包成zip包,然后第一次启动的时候解压缩。有补丁的时候再从网上下载补丁包解压缩。这样的流程本来是挺好的,但唯一的问题就是第一次启动的解压缩会有点讨厌。资源多的情况下,在红米Note一代这样的机器上面解压缩差不多要1分钟。这样的体验不是特别的好。
为了减少解压缩时间,我做了些尝试。
如果我们所有资源都在Resource内部的话,就可以完全没有解压缩过程了。(当然只是指资源,lua脚本还是必须解压缩的)刚好这时候有位网友问我,如果把资源都整包的放在Resource里面,然后只有改动的东西做成补丁包放在外部,这样的策略是否可行。我感觉是可行的,当时没有考虑太多,唯一担心的是整包出的包容量会不会比自己把Assetbundle打Zip包要大。尝试的结果是,很容易就做完了,而且容量反而更小。比如一个项目的所有美术资源的assetbundle有200M的,如果自己打zip包放安装包里面,发布apk的容量大概是80多M左右,但如果放在整包Resource里面发包,apk的容量才70M左右。
具体的做法是,把需要打assetbundle的美术资源预设等都直接放在项目的Resources文件夹里面,然后写个自动化工具将Resources文件夹里面的内容自动的设置assetbundleName。那样直接发布安装包,就会包含所有Resources里面的内容了,然后需要的时候Build一次assetbundle,然后记录assetbundle的哈希码,用于打补丁包时作对比。最后在加载的时候,先检查需要加载的文件是否需要外部加载,如果要,就读补丁包里面的assetbundle,如果不要,就直接Resource里面load出来。
这样的做法挺简单,也挺舒服的。不过后来发现了一个比较不好解决的问题。比如有十个模型都公用了一张贴图。按照正常的情况,我们如果修改了这一张公用的贴图后,只需要把该贴图单独的打包成补丁包就行了。但如果用了上面那种方式后,你要加载这十个模型,又想用到新的那张贴图,那你就只能把十个模型的assetbundle都打包成补丁包了。因为从简单来说,这十个模型在Resource里面都有完整的预设和资源,在load的时候完全不需要检查外部的图片,所以单独改变了图片,它根本不知道!包括了UI用到的图片也是一样的道理了。
其实要解决这一问题的方法也是有的,比如我们写一个工具,把Resources里面的资源都做一个配置记录,里面记录了该模型资源用到了哪些依赖的资源,比如一个UI用到了哪些图集、一个模型用到了哪些材质、贴图等。然后加载的时候,不完全信任预设,而是把这些记录下来的依赖资源逐个去检查是否需要外部加载,如果需要就重新赋值。但我感觉这样的做法有点本末倒置。在大部分的情况下,我们直接load出一个模型就能直接用了,完全没有额外的消耗。但现在为了预防一些依赖被外部资源替代了,我就不论黑白的把所有的资源都重新检查一遍。注意这种消耗是每次加载资源都会产生的。
解决这个问题的另外一个方法是,每一个资源预设的资源规划都是独立的,他们之间没有任何的公用。这样的情况下,我一个资源的依赖资源发生改变,直接把整个资源预设打包一个独立的assetbundle更新包出去,对其他预设没有任何影响。不过这个办法对资源划分有点高要求,不适合用在UI之类公用资源特别多的地方。我觉得适合用在比如格斗游戏出新角色的DLC等。
所以最后我还是放弃了这种做法,恢复到解压缩assetbundle的zip包。
那么要解决解压缩时间长的问题,就只能从解压缩的文件数量里面下手了。
之前也曾经说过,assetbundle拆分的力度问题。其实这是一个很多技巧和坑在里面的过程。拆的过散,会导致碎片文件太多,导致加载消耗大、解压缩时间长。拆得不够散,会导致文件冗余多,包容量变大。所以要拆到刚刚好才行。这个问题我之前说过方法,但后来被某位网友指出有漏洞,我将会另外再独立的探讨这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值