什么是热更新呢?首先需要了解移动程序的发布流程:将程序进行打包成相应平台的程序包,就拿Appsrote平台来说,需要将程序打包成xcarchive,打包好后,上传苹果商店,上传之后,苹果商店需要进行审核(审核的时间一般是一周左右),审核通过之后,玩家才可以下载最新的程序,下载时需要下载整个程序包,然后再安装最新程序包,安装好后,才可以运行最新游戏。下图是程序更新流程图。

wKioL1l1akrRD_DaAAByFLuWkqw884.png-wh_50


因此如果将资源和程序打包时放到程序包里,只要对资源和程序进行修改,就需要重新打包上传,提交,审核,下载,安装,非常的麻烦,因此需要一种方案来上述问题。以下的这种方案就是解决更新的问题。首先有一个程序基础包,在上传平台之后就不用对其代码和资源进行修改。然后将以后每次修改的资源放到资源服务器。当程序启动时,从资源服务器获取最新的资源。具体流程是:

 

1.将资源打包成AssetBundle,并将打包的资源文件的MD5保存到一个文件里,并定义此次更新的版本号xx.xx.xxx 

2.将资源提交到资源服务器

3.客户端启动,从资源服务器取得版本号ver1,然后再读取本地资源的版本号ver2,比较ver1ver2,如果ver1ver2相等,直接进入游戏,否则从服务器下载MD5文件列表,然后读取本地的MD5文件列表,然后对比两个文件,找到MD5改变的文件。

3.下载MD5文件改变的资源

4.更新本地版本配置文件

5. 进入游戏

 

这就是所谓的热更新,是指当我们在程序启动时,自动更新资源和程序,绕过平台的审核,这样更新程序和资源就非常方便。


对资源的更新比较简单,把资源打包成AB文件,然后放到资源服务器上,客户端程序启动时下载AB文件,程序加载AB文件就可以了,但对与C#程序来说如何进行更新呢,可以将C#打包到Dll里,然后将Dll放到资源服务器上,客户端下载DLL

通过如下代码加载Dll

 

WWW www = new WWW (URL);
yield return www;

System.Reflection.Assembly.Load (www.bytes)

 

需要注意的是以上代码只在Android,Windows平台可以运行,不能在IOS平台运行,因为IOS不支持JIT(即时编译),那如何在IOS平台进行更新呢?可以使用Lua脚本语言在IOS平台进行热更新。原理如下

wKiom1l1a4vBIBMwAADKQFoWyi0787.png-wh_50

因此为在统一所有平台进行热更新,这里选择Lua作为热更新语言。