Unity3D热更新全书-下载 唯一的一篇
下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么。
这一篇文字只是把下载的代码分享并介绍,而已。
首先,下载系统担负着几个使命。
第一、是保持客户端版本库的最新。
第二、是下载要能够比对并最少下载
第三、是要尽量快一些。
其实我们并没有写一个下载系统,因为实在没有几行代码。我们这里介绍的是一个
Http下载并保存缓存,首包从StreamingAssets读取,加载资源,三个功能在一起的模块
保持最新
为了解决第一第二的问题,我们要尽量让下载的资源零散一些。
这样就可以以文件单位进行下载,本地已经有的文件就不下载。
为了实现这个目标我们得在下载之前就决定一个文件是否要更新,因为下载之后流量已经浪费了。
需要知道一个文件是否应该更新,一种简单的办法就是给每个文件提供一个简单的特征信息,先将特征信息下载,然后决定是否下载整个文件。
去一个大文件的特征信息,这是摘要算法的工作,Hash、CRC32、MD5、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。
Unity3D热更新全书-下载 唯一的一篇的更多相关文章
- Unity3D热更新全书-PageZero
由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...
- Unity3D热更新全书-重头再来
之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...
- Unity3D热更新全书FAQ
只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态 ...
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...
- Unity3d热更新全书-加载(一)从AssetBundle说起
Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3 ...
- Unity3D热更新全书-脚本(一) 初识脚本
开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答 ...
- Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设
Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树. 每个节点对应一个GameObject对象 然后每个GameObject有若干个组件 有一些组件会与资源产生关系,比如Mes ...
- Unity3D热更新全书-脚本(五) NGUI
让我们实际的研究一下如何将NGUI和C#LightEvil结合起来. 这里使用NGUI2.7,因为他是一个开源的版本,NGUI最新的版本未经作者的许可,是不可以带入我们的开源项目使用的. 这个例子完成 ...
- Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架
C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们 ...
随机推荐
- [OSI]网络7层模型的理解
应用层:HTTP 应用层 表现层:编码 表现层 会话层:端口 会话层 传输层:TCP/UDP 协议 传输层 网络层:IP 标记 +-- 网络层 --+ 网络层 数据链路层:计算机Mac地址标记 | ...
- prism4 StockTrader RI 项目分析一些体会
StockTrader RI 代码分析也有一段时间了 刚从codeplex获取到源代码的时候,看得一头雾水,不知所云(因为之前没做过wpf的项目,看文档也静不下那心来看) 后来就想了个笨办法,模拟项目 ...
- 【温故Delphi】Win32API之CreateMutex
解决问题 如何让一个软件在一台机器上只能运行一个实例呢?这个问题用专业术语就是进程互斥.这个问题可以通过CreateMutex来解决. 进程互斥的核心思想:进程在启动时首先检查是否存在此进程实例,如果 ...
- ActionScript 3.0 自写类整理笔记(十三)——Random类
一个简单的随机函数工具类,总共提供了9种静态方法来获取不同的随机值随便写的,如果你还有什么更好的建议,请提出来,谢谢~ index.Random类:代码:public final class Rand ...
- 《数据结构》 java的一维数组的内存结构与其特性
1{数组的概念: 数组是相同类型变量的集合,可以使用共同的名字引用它.数组也可以被定义为任何类型,可以是一维或者二维的.数组的访问时通过其对应的下标来实现的.数组提供了一种将有联系的信息便利分组的方式 ...
- ASP.NET Core 1.0 入门——了解一个空项目
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- 通过inflate获取布局,设置layoutparams无效
给ll——addtiem当设置layoutparams无效时,试着修改上一个布局的属性
- webkit浏览器css设置滚动条
主要有下面7个属性: ::-webkit-scrollbar 滚动条整体部分,可以设置宽度啥的 ::-webkit-scrollbar-button 滚动条两端的按钮 ::-webkit-scroll ...
- Python 性能优化——对象绑定
不同函数调用方式对应不同的绑定次数: import profile class A: def f(self): pass def foo(): a = A() for i in range(10000 ...
- HP iLo2 试用序列号
HP iLo2 试用序列号 2 条回复 32Q8W-GKHTR-NPDKY-5CD79-T525H hp的ilo2功能实在太有用了,不用往那个恶劣的机房跑了,系统重装也直接远程完成. 这个试用序列号用 ...