游戏上线后,遇见bug或者需要更新内容(包括资源,玩法,数值调整,游戏脚本等)的时候,一般有2种做法。第一种,发个新包,然后让玩家下载新的版本;第二种,在游戏内更新,游戏启动时去下载需要更新的资源。第一种我们一般称为游戏大版本更新,第二种称为热更新。
一般来说,不能通过小版本更新解决的问题,才会用到大版本更新,例如,不可热更的游戏代码。而热更新是建立在每次大版本更新的基础上进行的更新,因此,这2种更新方式应该互相承接。
我们可以通过版本文件和更新文件以及版本号来实现大版本更新和热更新。游戏的版本号由大 版本+资源版本 构成,每一次大版本更新,大版本号增加,资源版本号重置。每一次热更新,大版本号不变,资源版本号增加。
版本文件(MD5File)记录每一个资源的MD5值。
例如:
a.txt,1630d23f45464df6071a9948dd1592bf
b.texture,f9c985a8f2a86292a024c4ed21ed33fb
更新文件(UpdateFile)记录每一个更新文件的资源版本号,资源版本号对应玩家去服务器上哪个版本库里下载资源。
例如:
a.txt,0.1
c.txt,0.2
大版本更新流程:
1.清除之前的版本文件和更新文件
2.打包所有的资源
3.计算每个资源的MD5值,创建新的版本文件,将所有资源的资源名称和对应的MD5值保存在版本文件中。
热更新流程:
1.打包所有资源
2.计算每个资源的MD5值,并和版本文件中记录的MD5值做比较,将MD5值发生变化的资源和被删除的资源记录下来。
3.
如果不存在更新文件,即现在是在大版本后的第一次热更新,创建一个更新文件,将所有MD5值发生变化的资源的名称和其版本号记录在更新文件中,格式为为【文件名,当前资源版本号】。
如果已经存在更新文件,即现在是在上一次热更新之后继续热更新。首先读取上一次的更新文件,然后遍历本次MD5值发生变化的资源,如果资源名称在更新文件中存在,则将更新文件中该资源版本号置为当前版本;如果资源名称在更新文件中不存在,则在更新文件中添加新的记录,存放其资源名称和当前资源版本号;如果更新文件中存在被删除的资源名称,将该资源的记录从更新文件中移除。
4.上传需要更新的资源和更新文件(UpdateFile)到服务器
5.删除原来的版本文件,将所有资源的MD5值保存在新的版本文件中。
玩家进入游戏后,首先判断是否需要更新版本,如果是大版本更新,则提示需要重新下载安装包;如果是小版本更新,则先下载更新文件(UpdateFile),然后根据更新文件中的资源名和版本号去对应的地址下载资源。
服务器下载目录结构
UpdateFile.txt
0.1(资源版本号文件夹)
-------a.txt
0.2(资源版本号文件夹)
-------a.txt
-------c.txt
0.3(资源版本号文件夹)
-------a.txt
-------d.txt
假设UpdatFile.txt内容为:
a.txt,0.3
c.txt,0.2
d.txt,0.3
如果玩家的版本是0.1,则玩家需要去0.3的目录下下载a.txt和d.txt,去0.2的目录下下载c.txt.。
如果玩家的版本是0.2,则玩家只需要去0.3的目录下下载a.txt和d.txt。
通常会在客户端缓存玩家下载过的资源和版本号,然后与updateFile文件做对比,生成需要下载的文件列表,然后去服务器下载即可。