公司项目接近尾声了,对于lua热更新也有一点心得体会,记录于此,以免忘记.

1.打包是打成整个zip,还是单个加密的lua二进制文件

将源码编译成单个加密的二进制文件,需要在服务器维护一份比较大的文件配置表,但是好处在于,进游戏检查更新是单个文件比对,然后下载,这样如果在上次下载到一半中断的话,第二次进来下载可以少下几个文件,但是逐个比对太过繁琐,而且代码文件本身比较小,有点得不偿失的感觉(理论上图片资源也能这样做,不过就又增加了比对的量),因此,我最终选择了直接将代码打包成一个zip,然后供客户端更新的方式,将每次更新下载到的补丁包按版本号命名,之后每次启动游戏时候,按照版本号高低,从低到高依次加载zip.同时,对于cocos,在更新完之后,需要将放沙盒内的资源文件夹,使用addSearchPath添加进引用路径,这样对于一些图片的修改(存在重名的情况下),会优先使用后添加进引用路径里的资源.

2.跨版本更新的策略

一些游戏是按照补丁的发布,逐个下载补丁包,私以为这样体验不好,同时也不可避免地下载了重复资源.因此一开始做这块的时候,便是朝着可以一次下载增量更新包的目标而去,其实也简单,假设有1,2,3三个版本,先用2版本和1版本对比,比对出一个[1-2]的增量文件夹,然后再拿2版本和3版本对比,比对出一个2-3的增量文件夹,最后,再将2-3的增量文件夹覆盖至1-2的增量文件夹,即可得到一个1-3的增量文件夹,然后将这3个文件夹分别编译打包,即成为1-2,2-3,1-3的3个增量补丁包,客户端请求服务器时,服务器根据客户端传上来的版本与服务器当前最高版本号对比,将对应的补丁包下载地址返回给客户端,即可实现跨版本增量更新.

3.后续补充一些遇到的问题

由于热更新其本质,就是在游戏主逻辑开始前,加载sandbox里的脚本/资源,因此在用户直接覆盖网上下载一个新包,安装游戏的时候,由于手机并不会将sanbox清除掉,会导致加载到旧的补丁包,目前的解决方案是在打程序包时准备一个txt文件,将当前版本号写入,在更新逻辑之前,先取txt文件的版本号,去跟sandbox下的补丁包对比版本,来判断是否加载该补丁.将编辑txt的步骤直接放进编译lua脚本的时候做了,也还算方便.后续有问题再补充.