需求
当游戏须要更新时,没必要让用户下载新的完整包,
只须要经过游戏内部的更新系统自动更新差别包,达到节约用户流量和时间的目的。java
大致思路:
1.(游戏逻辑用lua等脚本编写的状况)
这种方式的增量更新很是简单,由于脚本自己能够当成资源来处理,只须要将脚本和其余资源(美术资源,配置档)
从游戏的原包(apk)中剥离出来,每次版本更新将旧版本和新版本的资源包做对比,生产差别资源包便可。android
2.(游戏逻辑用c++等编译型语言编写的状况)
这种方式相对来讲复杂一些,展开说一下,以c++做为游戏主逻辑的开发语言为例。c++
分析:通常apk程序部分由java和c++两部分组成,java部分主要负责与android平台相关的逻辑,而c++部分则主要
负责游戏的核心逻辑。一般咱们将全部的核心逻辑编译打包成一个后缀为.so的动态连接库,游戏开始运行的时候由java
端经过jni调用动态库中的本地函数来运行游戏的核心逻辑。而游戏更新部分除了资源包,剩下的就是这个.so文件(游戏
核心逻辑部分)。web
须要作得事:
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的差别包,这样玩家就能够从任何一个版本一次性升级到最新版本,优势是玩家跨版本更新的时间和流量都减小,缺点是每次出版本须要耗费的时间更长。lua
最后说一下平台登陆和支付相关的模块所有要放在客户端更新模块的好处,这样每次出新版本时不过有多少平台,只须要生成一个通用的差别包,这样就能大大减小维护和测试时间。url