• Unity3D热更新全书-下载 唯一的一篇


    下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么。

    这一篇文字只是把下载的代码分享并介绍,而已。

    首先,下载系统担负着几个使命。

    第一、是保持客户端版本库的最新。

    第二、是下载要能够比对并最少下载

    第三、是要尽量快一些。

    其实我们并没有写一个下载系统,因为实在没有几行代码。我们这里介绍的是一个

    Http下载并保存缓存,首包从StreamingAssets读取,加载资源,三个功能在一起的模块

    源码位置https://github.com/lightszero/easydown

    保持最新

    为了解决第一第二的问题,我们要尽量让下载的资源零散一些。

    这样就可以以文件单位进行下载,本地已经有的文件就不下载。

    为了实现这个目标我们得在下载之前就决定一个文件是否要更新,因为下载之后流量已经浪费了。

    需要知道一个文件是否应该更新,一种简单的办法就是给每个文件提供一个简单的特征信息,先将特征信息下载,然后决定是否下载整个文件。

    去一个大文件的特征信息,这是摘要算法的工作,Hash、CRC32、MD5、Sha1,我们这里选择最优秀的Sha1算法来做我们文件的特征信息。

    image

    首先我们得为我们打算下载的文件生成特征信息,这些测试文件和工具源码你都可以从GITHUB上下载到。

    点击检查,会显示出如上的情况,告诉你版本和你上次的版本发生了什么变化。

    请勿删除生成的allver.ver.txt文件,他会记录总的版本,每次检查都会基于上一个版本

    然后点击生成版本,会更新所有的版本文件

    这里我们加了个group的设计

    版本生成工具会把自己路径下的文件夹作为group

    在客户端下载时是以group为单位的,方便处理

    比如我可以 把高分辨率资源和低分辨率资源分别放在两个group里

    只要客户端简单的切换group名字,就可以实现资源切换。

    image比如这里就生成了两个Group,每个Group有自己的Ver文件

    image

    我们看看Ver文件

    文件名,中间怪怪的就是sha1特征串,哪怕文件只改了一个字节,生成的特征串就会不一样。最后是文件尺寸,这样我们只要取得了ver文件,下载之前就知道文件有多大了。

    这样我们就有了让文件版本保持最新的机制了

    只要先下载ver文件,然后再判断每个group的文件有没有变化,有变化的有多少,然后下载他们。

    把这些测试文件找个Http服务器放上去,然后我们继续

    image

    客户端下载

    客户端如何下载?直接看代码说明

    image

    先一行代码初始化资源管理系统

    第一个参数是下载服务器地址,就是对应allver.ver.txt文件的http地址

    第二个参数是一个回调函数,由于初始化资源系统会去网络下载ver文件,需要时间,所以是用回调函数来通知的

    第三个参数是一个List<string>,用来告知资源管理器,要检查哪几个Group。

    你也许会疑问,怎么会有不检查的Group呢?比如我们的游戏要做好几个平台,有一些平台不通用的资源,我们把他们放在不同平台,这样在一个平台就不会去检查别的平台的资源。

    注意Resmgr需要一直Update,因为不管是下载还是加载都不是立即完成的,Resmgr要一直监控情况

    image利用宏你就可以取到每个平台一个特殊的字符串,把他们混到group名字,就可以自动选取平台专用group下载了

    还有第四个默认参数:并发下载数,默认1,要想充分利用下载带宽,你可以改成2,改更多的并发意义并不大,3并发和2并发效果不会有很大差异。

    image

    taskState是资源管理器提供的一个简单统计工具,用来得到有几个任务在执行,完成了几个。

    GetNeedDownloadRes 就是比对出那些需要下载的资源

    然后循环,下载,下载每个资源都可以提供一个独立的通知回调,但我们这里演示的是一个开始批量下载的用法,就不单独处理了。

    最后WaitForTaskFinish函数,会一直等到所有任务完成再回调给我们,

    这就完成了整个下载过程

    下载进度

    关于下载进度,我们可以利用taskState做简单的文件数量统计,也可以把downlist里面的每个文件的长度取出来自己计算。

    演示个简单的

    image

    注意Resmgr需要一直Update,因为不管是下载还是加载都不是立即完成的,Resmgr要一直监控情况

    加载使用

    无论文件是本地最新还是刚刚下载完,无论是首包资源还是更新资源,我们的加载方式都是一样的

    image

    从Resmgr的 verLocal,本地版本管理 中取得对应的Group,然后从Group中取出File,然后调用File的BeginLoadXXX方法即可

    image

    我们提供了四种Load接口,其实一种Bytes就够了,其他资源全部都从Bytes中来,这个我们在加载篇中讲过。

    但是考虑到常用性,我们对String Texture2D AssetBundle统一作了封装。

    还有以下其他的资源是符合加载的,需要多个文件联合才能加载出来,我们把这种文件放到加载篇里去研究。

    好了,你现在已经拥有热更新最重要的更新模块了,而且他完全For Free。

  • 相关阅读:
    Windows Server AppFabric:更好,更快,更便宜
    扩展DropDownList控件和ListBox控件(1) 支持分组功能(optgroup标签)
    化零为整WCF(3) 绑定Binding(basicHttpBinding和netTcpBinding)
    化零为整WCF(9) 序列化(DataContractSerializer, XmlSerializer, DataContractJsonSerializer, SoapFormatter, BinaryFormatter)
    化零为整WCF(1) 不能免俗,我也从Hello开始
    化零为整WCF(12) 并发和限流(Concurrent和Throttle)
    化零为整WCF(6) 消息处理(异步调用OneWay, 双向通讯Duplex)
    化零为整WCF(8) 消息处理(使用流数据传输文件)
    招聘ASP.NET高级·中级软件开发工程师[北京][过期]
    化零为整WCF(7) 消息处理(使用消息传输优化机制 MTOM)
  • 原文地址:https://www.cnblogs.com/crazylights/p/3900395.html
Copyright © 2020-2023  润新知