下载在这个时代实在是太日常了,每一个人都深入的理解着下载究竟是什么。git
这一篇文字只是把下载的代码分享并介绍,而已。github
首先,下载系统担负着几个使命。算法
第1、是保持客户端版本库的最新。缓存
第2、是下载要可以比对并最少下载服务器
第3、是要尽可能快一些。网络
其实咱们并无写一个下载系统,由于实在没有几行代码。咱们这里介绍的是一个并发
Http下载并保存缓存,首包从StreamingAssets读取,加载资源,三个功能在一块儿的模块函数
为了解决第一第二的问题,咱们要尽可能让下载的资源零散一些。测试
这样就能够以文件单位进行下载,本地已经有的文件就不下载。
为了实现这个目标咱们得在下载以前就决定一个文件是否要更新,由于下载以后流量已经浪费了。
须要知道一个文件是否应该更新,一种简单的办法就是给每一个文件提供一个简单的特征信息,先将特征信息下载,而后决定是否下载整个文件。
去一个大文件的特征信息,这是摘要算法的工做,Hash、CRC3二、MD五、Sha1,咱们这里选择最优秀的Sha1算法来作咱们文件的特征信息。
首先咱们得为咱们打算下载的文件生成特征信息,这些测试文件和工具源码你均可以从GITHUB上下载到。
点击检查,会显示出如上的状况,告诉你版本和你上次的版本发生了什么变化。
请勿删除生成的allver.ver.txt文件,他会记录总的版本,每次检查都会基于上一个版本
而后点击生成版本,会更新全部的版本文件
这里咱们加了个group的设计
版本生成工具会把本身路径下的文件夹做为group
在客户端下载时是以group为单位的,方便处理
好比我能够 把高分辨率资源和低分辨率资源分别放在两个group里
只要客户端简单的切换group名字,就能够实现资源切换。
好比这里就生成了两个Group,每一个Group有本身的Ver文件
咱们看看Ver文件
文件名,中间怪怪的就是sha1特征串,哪怕文件只改了一个字节,生成的特征串就会不同。最后是文件尺寸,这样咱们只要取得了ver文件,下载以前就知道文件有多大了。
这样咱们就有了让文件版本保持最新的机制了
只要先下载ver文件,而后再判断每一个group的文件有没有变化,有变化的有多少,而后下载他们。
把这些测试文件找个Http服务器放上去,而后咱们继续
客户端如何下载?直接看代码说明
先一行代码初始化资源管理系统
第一个参数是下载服务器地址,就是对应allver.ver.txt文件的http地址
第二个参数是一个回调函数,因为初始化资源系统会去网络下载ver文件,须要时间,因此是用回调函数来通知的
第三个参数是一个List<string>,用来告知资源管理器,要检查哪几个Group。
你也许会疑问,怎么会有不检查的Group呢?好比咱们的游戏要作好几个平台,有一些平台不通用的资源,咱们把他们放在不一样平台,这样在一个平台就不会去检查别的平台的资源。
注意Resmgr须要一直Update,由于不论是下载仍是加载都不是当即完成的,Resmgr要一直监控状况
利用宏你就能够取到每一个平台一个特殊的字符串,把他们混到group名字,就能够自动选取平台专用group下载了
还有第四个默认参数:并发下载数,默认1,要想充分利用下载带宽,你能够改为2,改更多的并发意义并不大,3并发和2并发效果不会有很大差别。
taskState是资源管理器提供的一个简单统计工具,用来获得有几个任务在执行,完成了几个。
GetNeedDownloadRes 就是比对出那些须要下载的资源
而后循环,下载,下载每一个资源均可以提供一个独立的通知回调,但咱们这里演示的是一个开始批量下载的用法,就不单独处理了。
最后WaitForTaskFinish函数,会一直等到全部任务完成再回调给咱们,
这就完成了整个下载过程
关于下载进度,咱们能够利用taskState作简单的文件数量统计,也能够把downlist里面的每一个文件的长度取出来本身计算。
演示个简单的
注意Resmgr须要一直Update,由于不论是下载仍是加载都不是当即完成的,Resmgr要一直监控状况
不管文件是本地最新仍是刚刚下载完,不管是首包资源仍是更新资源,咱们的加载方式都是同样的
从Resmgr的 verLocal,本地版本管理 中取得对应的Group,而后从Group中取出File,而后调用File的BeginLoadXXX方法便可
咱们提供了四种Load接口,其实一种Bytes就够了,其余资源所有都从Bytes中来,这个咱们在加载篇中讲过。
可是考虑到经常使用性,咱们对String Texture2D AssetBundle统一做了封装。
还有如下其余的资源是符合加载的,须要多个文件联合才能加载出来,咱们把这种文件放到加载篇里去研究。
好了,你如今已经拥有热更新最重要的更新模块了,并且他彻底For Free。