需求
当游戏需要更新时,不必让用户下载新的完整包,
只需要通过游戏内部的更新系统自动更新差异包,达到节约用户流量和时间的目的。
大体思路:
1.(游戏逻辑用lua等脚本编写的情况)
这种方式的增量更新非常简单,因为脚本本身可以当成资源来处理,只需要将脚本和其他资源(美术资源,配置档)
从游戏的原包(apk)中剥离出来,每次版本更新将旧版本和新版本的资源包作对比,生产差异资源包即可。
2.(游戏逻辑用c++等编译型语言编写的情况)
这种方式相对来说复杂一些,展开说一下,以c++作为游戏主逻辑的开发语言为例。
分析:一般apk程序部分由java和c++两部分组成,java部分主要负责与android平台相关的逻辑,而c++部分则主要
负责游戏的核心逻辑。通常我们将所有的核心逻辑编译打包成一个后缀为.so的动态链接库,游戏开始运行的时候由java
端通过jni调用动态库中的本地函数来运行游戏的核心逻辑。而游戏更新部分除了资源包,剩下的就是这个.so文件(游戏
核心逻辑部分)。
需要做得事:
1.更新服务器,客户端需要连接更新服务器下载差异包
2.客户端更新模块,负责客户端版本的管理,需要从更新服务器上下载对应的差异包
3.文件差异对比生成工具,通过对比两个不同版本的资源包来生产差异包。
1)更新服务器
一个简单的支持http协议的web服务器,所有的版本差异包都放在里面,当客户端请求更新时,将对应的版本差异包所在位置的
url返回给客户端,客户端通过这个url从此服务器上下载差异包。比如客户端发送如下请求http://xxx/version/update/1.2
意思是客户端需要下载从1.1升级到1.2的差异包。
2)客户端更新模块
整个客户端程序结构应该是这个样子,(java部分)+(c++编写的更新模块部分)+(c++编写的游戏逻辑部分),其中前两个部分组成客户端更新模块,
两个c++部分的代码分别对应两个.so文件,其中(c++编写的游戏逻辑部分)的so文件将包含着差异包内,这样游戏逻辑就能被更新。
更新具体流程:客户端更新模块读取当前版本号,将版本信息发送给更新服务器检查,如果是不是最新版本,则下载更新包。
a)java部分,所有跟平台登录和支付相关的模块必须全部放在这里面
b)c++编写的更新模块部分,它负责连接更新服务器下载差异包,解压,启动游戏核心逻辑。注:因为游戏核心逻辑不在这个so文件里面,所以通过更新模块
调用核心逻辑的入口函数时,需要用到c++的动态函数调用技术,例如dlopen,dlsym这些函数
3)文件差异对比生成工具,可以自己写,也可以用现成的,比如Beyond Compare。
这里说一下版本差异包管理的两种方式,
第一种是每次出新版本时,只需要生成与之前一个版本的差异包,玩家需要跨多个版本更新时,需要下载多个差异包,
举例来说,现在游戏的最新版本是1.3,某一个玩家的游戏版本是1.1,那么他需要先更新到1.2,再更新到1.3,不过整个过程应该是更新模块自动完成。这种方式
的优点是每次出版本只需要出一个差异包,缺点就是玩家如果跨很多个版本更新时,将会耗费更多的时间和流量。
第二种是每次出新版本时,将最新版本和之前每一个版本都做对比,生成多个差异包,例如现在要出1.3的新版,那么开发团队需要做得就是生成一个1.3与1.1的差异包,
再生成一个1.3和1.2的差异包,这样玩家就可以从任何一个版本一次性升级到最新版本,优点是玩家跨版本更新的时间和流量都减少,缺点是每次出版本需要耗费的时间更长。
最后说一下平台登录和支付相关的模块全部要放在客户端更新模块的好处,这样每次出新版本时不过有多少平台,只需要生成一个通用的差异包,这样就能大大减少维护和测试时间。