一、说明:本文中的两种热更新非cocos自带热更新
二、理论:
1.第一种只存在一套资源,用一个文件记录所有文件的信息(文件名,路径,大小,MD5)。游戏启动时下载这个文件与本地文件MD5进行对比,不同的和新增的下载下来,没有的删掉。(最好再做个简要信息文件,因为资源多了记录文件信息的文件会有上百KB大小)
2.第二种存在多套资源,客户端每更新一个版本都会有一个内部版本号。更新服务端会有多套压缩包,如1.0-1.5, 1.1-1.5 ,1.2-1.5 ,1.3-1.5,1.4-1.5。此方法需要保留每个版本的文件资源,依次生成每一个版本到最新版本的增量压缩包(依据是文件名和MD5)
三、对比:
第一种和优点是方便管理,从始到终只有一套资源。缺点是玩家下载时流量多一点,因为没有压缩。
第二种优点是玩家下载流量小,但每次升级需要保留历史版本为升级依据,版本越多越不好管理。
四、取舍:
对于资源超级多的,更新周期相对较长(如一月一更,一季一更)且一次更新文件数量较多的,建议使用第二种。这样玩家下载时流量少很多,而且由于更新间隔较长,可以不保留所有版本,可以清理半年以前的版本。而对于更新频繁且资源量较少的建议使用第一种,本身流量较少,对于几天一更或者一周一更这种游戏来说管理非常方便。
五、设计:
1.一套资源的
将整套最新资源放在网站更新目录下,事先写一个update.exe的工具放在这里面。
update.exe所做的事情是:
(1)记录当前目录下所有文件的信息(文件名、路径、大小、MD5),保存在update.json中,写于当前目录
(2)计算update.json的MD5保存在update.cfg中(可命名为:UpdateFileMD5:xxxxxxxxxxx),写于当前目录(需要其它 字段可自己加,如版本号什么的)
运行update.exe生成升级文件。
客户端代码要做的事:
(1)程序启动时下载update.cfg,找到UpdateFileMD5与本地的UpdateFileMD5对比是否一致,如果一致则本客户端是最新版本可以直接进入游戏;如果不一致则下载update.json,解析所有文件信息与本地文件信息进行对比,记录需要下载的(更新和增量)和要删除的(本地有而更新服务器上没有的)。计算要下载的文件总大小,提示给用户选择是否下载。下载完成后删除不需要的文件,把UpdateFileMD5写成最新的,然后进入游戏。
1.多套资源的
将历史版本和最新版本资源放在管理目录下,事先写一个update.exe的工具也放在这个目录下。
update.exe所做的事情是:
(1)计算每个历史版本的文件与最新版本文件的MD5
(2)对比每个历史版本文件的MD5与最新版本文件的MD5,找出需要下载的文件分别打成对应该的版本包(如1.1.rar)
(3)将所有版本的版本号保存在update.cfg(特别标记下最新版本),写于当前目录
客户端代码要做的事:
程序启动时下载update.cfg,比较下本地版本号是不是最新版本号,如果是最新版本则进入游戏,如果不是最新版本则下载相应的包,解压,改写本地版本号,进入游戏。
这里如果想要删除不需要的文件的,可以自己加一个协议
六、注意事项(针对cocos lua):
(1)下载或者解压完成后要清除cocos FileUtils文件信息缓存:cc.FileUtils:getInstance():purgeCachedEntries(),
否则本次更新的文件不会生效(增量除外)
(2)请在添加可写(cc.FileUtils:getInstance():getWriteablePath())目录为优先搜索目录(cc.FileUtils:getInstance():addSearchPath("xxxx")),下载的文件和解压的文件放在这个目录。因为安卓的资源是一个压缩包,为了统一以及方便管理建议这么做。
(3)lua文件重新生效需要进行reload,图片生效也需要进行更新或者清理
好了,基本就这样了,我说的不明白或者有不对的地方欢迎留言