搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 吹弹牛皮之unity程序设计 > 吹弹牛皮之Unity 浅析AssetBundle

吹弹牛皮之Unity 浅析AssetBundle

吹弹牛皮之unity程序设计 2020-05-06

    新的起点崭新的工作环境,遇上了封神级的大佬。初次阅读大佬的编码那种感觉就像是在欣赏丝绢上的绣花,一个对象的巧妙包装,一个字节的节省,哪怕是一个缩进一个命名都是那么的规范优雅。回头再看小菜自己的代码就真的像极了如厕的纸又臭又皱,时常为了功能的改动和拓展还要大动干戈的猛戳几个大窟窿吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle

    小菜的最近一周都把精力集中到了AssetBundle的打包和AssetBundle的加载流程上,并针对多个接口的数据加载效率做了大量的实验性测试数据的统计。小菜也在一周的挣扎爬坑中度过岁月。并将遇到的难点和问题分享出来。

吹弹牛皮之Unity 浅析AssetBundle

    AssetBundle已经是一个老生常谈的话题了。一般来说谈到这里就不得不提及下热更新。目前大部分的企业都借助了lua脚本做编码热更的方案,这也完全得益于lua脚本的JIT特性。实际原理也是将热更的编码当作资源处理了。


吹弹牛皮之Unity 浅析AssetBundle

    关于JIT内容,它的另一个相对应的概念是AOT。 这两个概念的粗狂解释是编码语言静态编译与动态解释的区别。本文重在讨论AssetBundle不想增加过多理解的难度,更多的详情还需要大家自己的理解和查询。

吹弹牛皮之Unity 浅析AssetBundle

    都知道AssetBundle是用来处理资源更新,就如我们常玩的王者荣耀一样,随着版本的更新在启动的时候我们自动回去下载资源然后体验到新版本的内容。整个过程无需再去商店上下载新的包来安装。


    下面小菜就来揭开AssetBundle的神秘面纱,来初探下AssetBundle的整个流程。

    走个1-2-3的话小菜将整个ab的过程描述为轻松的三步。

吹弹牛皮之Unity 浅析AssetBundle

1).将AB资源打包

2).将打包好的AB资源上传到web服务器


【AssetBundle流程详解】


1.AB资源打包流程

这一步的过程可以说是非常简单的就是调用一个api就可以了。

BuildPipeline.BuildAssetBundles();

设置方法可以使用打标记的方式。(遍历要打包的资源设置)

吹弹牛皮之Unity 浅析AssetBundle

吹弹牛皮之Unity 浅析AssetBundle


另一个种方式是自己维护AssetBundleBuild[]的方式。

吹弹牛皮之Unity 浅析AssetBundle


    两种方式小菜都用过,使用的人可能各有说法小菜不在这里讨论了吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle


    想必很多开发者都遇到过,为什么我打了AB包发现AB包反而比之前的资源还大?

    由于小菜在最早的设计并不想维护错综复杂的一系列的加载问题,仅仅简单设计的是单包的加载方式(一个资源就是一个包)。资源确实增大了不少也没有深究。吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle直到最近小菜才发现自己错了好久使用新的流程并纠正了过来。原因是由于共享资源被分别打进了不同的包里导致的。

    没有摸过AB坑的很难来理解这点,实际上它也就是发生了如下图例所示的情况。导致重复资源打进了不同的包里导致的。吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle这个解释是不是很牵强。

吹弹牛皮之Unity 浅析AssetBundle


共享依赖打包

共享依赖打包,这是小菜探寻到的解决方案。不管是打标记方式也好,还是自己去AssetBundleBuild[]的方式也好。我们都可以去找寻这层依赖关系。其实资源之间的依赖关系,就是一个树形依赖关系,只要能构建出资源之间的依赖树,那么就能了解到某个资源被多少颗树引用,也就是被多少个资源引用。

吹弹牛皮之Unity 浅析AssetBundle

万能的递归是查找这类问题比较高效的手段,辅助分析的是下面的一个api。

Object[] deps = EditorUtility.CollectDependencies(new Object[] { self.GetAsset() });


在针对实际项目做开发的时候合理的分组包策略也是尤为重要的。


压缩方式与加载速度

大致上目前使用的有三种压缩方式(不压缩,LZMA,LZ4)。

BuildPipeline.BuildAssetBundles时参数传入

1).BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载最快。

2).BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长,需要解压全部。

3).BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。


总结,使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小。是大部分企业选择的最优最多的一种方式。拿小菜自己的实验来看,PC上LZ4比LZMA加载快3-4倍,ANDROID上LZ4比LZMA加载快1-2倍。仅仅LZ4包会比LZMA包要大上一丢丢。


2.AB上传到web服务器流程。

吹弹牛皮之Unity 浅析AssetBundle

稍微留意的是用于日后加载流程中的包的校验。到底我们下载下来的包是不是我们服务器上下载的包呢?资源有没有在传输过程中被篡改丢失呢?除了考虑包的加密和解密外我们可以考虑做一个校验。


AB包的校验

    我们不妨在打包后多生成一个校验信息文件,一起存放入web服务器中,在下载或者加载的时候读取下文件做个校验。如果这个包不完整或者有丢失我们就要可以做相应的做一些应对策略。

    常见的校验方式有三种。具体如下:

吹弹牛皮之Unity 浅析AssetBundle


3.AB的资源加载流程

资源的加载实际上也是区分两种,避免怕怼早先在这里做说明。吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle

1).先下载到本地然后从本地读取。

2).可以直接从web服务器上读取。


考虑到网络波动的不确定性,和大量网络资源加载所等待的时间带来的体验问题。大部分的游戏都采用了先下载到本地再加载的方式。也就是方式1啦,不容忽略的是从web服务器直接的加载读取也是OK的。


针对这些加载的接口如下:

吹弹牛皮之Unity 浅析AssetBundle

www的方式逐渐被官方所遗弃了,目前来说应用常规且广泛的还是LoadFromFile和LoadFromFileAsync这两个接口。

吹弹牛皮之Unity 浅析AssetBundle

我们要非常小心的处理加载流程中的两件事情。

1).加载资源时要注意包和包之前的依赖引用关系。(还是递归查找依赖树)

2).小心的处理不同平台和不同资源路径下存放时的路径。


就安卓平台而言下载的资源存放在Application.persistentDataPath沙盒路径中。但是如果是直接存放入StreamingAssets文件夹中附带打包的话,它的路径就是下面这样,而并非Application.streamingAssetsPath。

吹弹牛皮之Unity 浅析AssetBundle

这让摸不着道的小菜反复打包尝试才从坑里爬出来。


    AssetBundle如果是从头到尾新去尝试的话,这中间可能要解决的问题远比小菜所展示的还要多吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle吹弹牛皮之Unity 浅析AssetBundle。希望能对伙伴有大的帮助。


    日新月异技术在不断更新。Unity也产生了新的资源管理方式Addressable方式。基于AssetBundle却更强大,智能的处理维护AB中的复杂的引用依赖关系,很好的解决低配,普通,高清资源的加载等,同时也提供了可以分析加载时的情况的工具。遗憾的是小菜使用的依然是2017,仅仅在2018 2019版本中才有,并需要通过Packagemanager去下载使用。

 下面就先来一睹Addressable的加载方式吧。

吹弹牛皮之Unity 浅析AssetBundle

吹弹牛皮之Unity 浅析AssetBundle


尽管技术在更新在变,作为程序员有一个强大的知识积累,良好的逻辑思维和设计思想才是王道。

本文还是有些水的谢谢大家的关注!吹弹牛皮之Unity 浅析AssetBundle

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《吹弹牛皮之Unity 浅析AssetBundle》的版权归原作者「吹弹牛皮之unity程序设计」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注吹弹牛皮之unity程序设计微信公众号

吹弹牛皮之unity程序设计微信公众号:gh_4f97f8f53f59

吹弹牛皮之unity程序设计

手机扫描上方二维码即可关注吹弹牛皮之unity程序设计微信公众号

吹弹牛皮之unity程序设计最新文章

精品公众号随机推荐