游戏大版本更新和热更新

游戏上线后,遇见bug或者需要更新内容(包括资源,玩法,数值调整,游戏脚本等)的时候,一般有2种做法。第一种,发个新包,然后让玩家下载新的版本;第二种,在游戏内更新,游戏启动时去下载需要更新的资源。第一种我们一般称为游戏大版本更新,第二种称为热更新。

一般来说,不能通过小版本更新解决的问题,才会用到大版本更新,例如,不可热更的游戏代码。而热更新是建立在每次大版本更新的基础上进行的更新,因此,这2种更新方式应该互相承接。

我们可以通过MD5文件和更新文件以及版本号来实现大版本更新和热更新。游戏的版本号由大版本号+资源版本号构成,每一次大版本更新,大版本号增加,资源版本号重置。每一次热更新,大版本号不变,资源版本号增加。

MD5文件(MD5File)记录每一个资源的MD5值。 例如:

a.txt,1630d23f45464df6071a9948dd1592bf
b.texture,f9c985a8f2a86292a024c4ed21ed33fb

版本文件(VersionFile)记录每一个更新文件的资源版本号及新的MD5值,资源版本号对应玩家去服务器上哪个版本库(路径)里下载资源,MD5值用于服务器的资源和本地资源是否一样,避免重复下载。 例如:

 a.txt,1630d23f45464df6071a9948dd1592bf,0.1
 c.txt,2312xd23f45464df6071a9948dd1592b,0.2

大版本更新流程

  1. 清除之前的Md5文件和版本文件

  2. 打包所有的资源

  3. 计算每个资源的MD5值,创建新的Md5文件,将所有资源的资源名称和对应的MD5值保存在MD5文件中。

热更新流程

  1. 打包所有资源

  2. 计算每个资源的MD5值,并和MD5文件中记录的MD5值做比较,将MD5值发生变化的资源和被删除的资源记录下来.

  3. 判断是否存在版本文件: 如果不存在版本文件,即现在是在大版本后的第一次热更新,创建一个版本文件,将所有MD5值发生变化的资源的名称和其版本号记录在版本文件中,格式为为【文件名,新的MD5值,当前资源版本号】。 如果已经存在版本文件,即现在是在上一次热更新之后继续热更新。首先读取上一次的版本文件,然后遍历本次MD5值发生变化的资源,如果资源名称在版本文件中存在,则将版本文件中该资源版本号置为当前版本;如果资源名称在版本文件中不存在,则在版本文件中添加新的记录,存放其资源名称和当前资源版本号;如果版本文件中存在被删除的资源名称,将该资源的记录从版本文件中移除。

  4. 上传需要更新的资源和版本文件(VersionFile)到服务器

  5. 删除原来的MD5文件,将所有资源的MD5值保存在新的MD5文件中。

玩家进入游戏后,首先判断是否需要更新版本,如果是大版本更新,则提示需要重新下载安装包;如果是小版本更新,则先下载版本文件(VersionFile),然后根据版本文件中的资源名和版本号去对应的地址下载资源。

服务器下载目录结构


0.1(资源版本号文件夹)

-------a.txt
-------VersionFile.txt

0.2(资源版本号文件夹)

-------a.txt
-------c.txt
-------VersionFile.txt

0.3(资源版本号文件夹)

-------a.txt
-------d.txt
-------VersionFile.txt

假设VersionFile.txt内容为:

a.txt,1630d23f45464df6071a9948dd1592bf,0.3

c.txt,d23f45464df6071a9948dd1592bfw2sb,0.2

d.txt,30d23f45464df6071a9948dd1592bfx2,0.3

如果玩家的版本是0.1,则玩家需要去0.3的目录下下载a.txt和d.txt,去0.2的目录下下载c.txt.。

如果玩家的版本是0.2,则玩家只需要去0.3的目录下下载a.txt和d.txt。

通常通过上次下载的版本文件与这次版本文件做对比,生成需要下载的文件列表,然后去服务器下载即可。

工程地址参见:https://github.com/yrsc/AssetBundleFramework

猜你喜欢

转载自blog.csdn.net/qq_14914623/article/details/81258129
今日推荐