Unity3d热更新全书-加载(一)从AssetBundle提及

Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle.android

咱们也来讲说AssetBundle

咱们试全面的分析一下Unity3D提供的资源加载机制ios

1.Resources//内嵌资源,使用方法Resources.Load,能够加载任意种类的资源,不能动态修改,卒。web

2.StreamingAssets//随包资源,使用方法IO或WWW.LoadWWW.Load能够加载任意种类资源,IO仅限bytes 和 text。算法

3.WWW 从网络下载并加载缓存

4.WWW 从网络加载AssetBundle网络

一和二显然不具备热更新的效果,这里就不作讨论。布局

3 4都是从网络加载,他们有什么区别呢。动画

首先说3,这是没有缓存的,咱们显然不想让用户重复的浪费流量,不可取。图片

而后是4,assetBundle提供了一个版本号来作缓存比对,能够比较好的起到更新的目标资源

assetBundle原来就是Unity3D为咱们准备的解决方案,难怪每本书都会大篇介绍AssetBundle,后文简称AB。

每本书都告诉你,AB很强大,AB帮你解决了跨平台问题,帮你解决了依赖关系。

而这个系列,不打算只讲别人讲的东西,咱们要告诉你一些小秘密。

AssetBundle是天使仍是恶魔

首先AB的确很好很强大,他能收纳Unity本身的全部资源种类,贴图、材质、shader、预设。

而后能够每平台支持,这就是第一个陷阱,注意是每平台支持,不是多平台支持。

每一个平台要单独导出,而每一个平台到底差了些什么呢?答案是,nothing。

那么为何每一个平台要单独导出呢?由于Unity考虑到每一个平台的质量关系,进行了质量相关的差别化。

而最大的质量差别,源自贴图。

有些平台贴图不压缩,有些平台贴图要压缩,并且根据不一样的平台特性,套用不一样的压缩算法,先压过再存到包里。

这就是AB帮你干的最主要的事情。

听起来很贴心呢,等等,你是否是忘了一个特定的命题,这个命题叫作UI。

压缩的图片会有质量损失,UI贴图咱们一般是不压缩的。

而后UI还会触及到AB的另外一个问题

以NGUI为例,NGUI的资源关系比较复杂,有贴图-》图集-》布局

不一样布局常常交叉引用贴图

若是用AB想把每一个界面分开打包,给用户最小的资源更新量,这个任务能够用灾难来形容。

最终热更新推送给用户的东西是以文件为单位的,而AB在小粒度文件而且之间有较为复杂的引用关系这种需求下的使用是一场灾难。

AB对每一个平台的差别编译不是可选的,而是强制的,假如你有web、ios、android三个平台,不管如何你都要导出三次。

没了AssetBundle,咱们怎么办

把碎片文件下载回来,而且组装

对于UI这个情境,是彻底可行的。把布局和图集保存为文本形式,把文本和贴图下载回来,而后组装。

对于其余的场景片断,在有动画和贴图须要压缩的状况下,AB依然是惟一选择。

unity没有提供在运行时压缩贴图的手段,动画也不容易存取,只能在运行时压缩DXT,只有pc和wp8支持。

对于各类各样的资源加载会特别的凌乱么?不会。

其实本质上能够统一成Bytes的处理

Texture能够从Bytes加载

字符串 能够从Bytes加载

AB能够从Bytes加载

自定义二进制存储,嘛自己就是bytes

因此只要咱们的下载系统提供下载bytes并缓存,以后全部的资源加载都从Bytes进行,就能够统一块儿来。

下载部分咱们在另外一个专题介绍。

下一篇介绍将UI布局保存到文件与恢复。

相关文章
相关标签/搜索