需求
当游戏需要更新时,不必让用户下载新的完整包,
只需要通过游戏内部的更新系统自动更新差异包,达到节约用户流量和时间的目的。

大体思路:
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的差异包,这样玩家就可以从任何一个版本一次性升级到最新版本,优点是玩家跨版本更新的时间和流量都减少,缺点是每次出版本需要耗费的时间更长。

最后说一下平台登录和支付相关的模块全部要放在客户端更新模块的好处,这样每次出新版本时不过有多少平台,只需要生成一个通用的差异包,这样就能大大减少维护和测试时间。

android游戏的增量更新(资源及代码的热更新)的更多相关文章

  1. 【Quick 3.3】资源脚本加密及热更新(三)热更新模块

    [Quick 3.3]资源脚本加密及热更新(三)热更新模块 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 lua相对于c++开发的优点之一是代码可以在运行的时候才加载,基于此我们 ...

  2. 【Quick 3.3】资源脚本加密及热更新(二)资源加密

    [Quick 3.3]资源脚本加密及热更新(二)资源加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 在前一篇文章中介绍了代码加密,加密方式是XXTEA.对于资源文件来说,同样 ...

  3. 【Quick 3.3】资源脚本加密及热更新(一)脚本加密

    [Quick 3.3]资源脚本加密及热更新(一)脚本加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.脚本加密 quick框架已经封装好加密模块,与加密有关的文件在引擎目录/quic ...

  4. Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建

    前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...

  5. GridView中的编辑和删除按钮,执行更新和删除代码之前的更新提示或删除提示

    在GridView中,可以通过设计界面GridViewr任务->编辑列->CommandField,很简单的添加的编辑和删除按钮 在前台源码中,可以看到GridView自动生成了两个列. ...

  6. 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以

    热更新是什么?简单的说就是打补丁,只补需要部分,不用重个游戏包重打上传 热更新问题的本质是代码更新而不是资源更新,为什么呢? 大型手游都是将补丁资源放在专门的WEB服务器上,游戏启动时动态下载并放入到 ...

  7. Node.js中的express框架,修改内容后自动更新(免重启),express热更新

    个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 以前node中的express框架,每次修改代码之后,都需要重新npm s ...

  8. Unity3D热更新之LuaFramework篇[09]--资源热更新与代码热更新的具体实现

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建 中,我介绍了热更新的基本原理,并且着手搭建一台服务器. 本篇就做一个实战练习,真正的来实现热 ...

  9. Unity资源打包学习笔记(二)、如何实现高效的unity AssetBundle热更新

    转载请标明出处:http://www.cnblogs.com/zblade/ 0x01 目的 在实际的游戏开发中,对于游戏都需要进行打补丁的操作,毕竟,测试是有限的,而bug是无法预估的.那么在手游中 ...

随机推荐

  1. WPF 自定义键盘焦点样式(FocusVisualStyle)

    WPF 自带的键盘焦点样式是与传统控件样式搭配的,但 WPF 凭着其强大的自定义样式的能力,做出与传统控件样式完全不同风格的 UI 简直易如反掌.这时,其自带的键盘焦点样式(FocusVisualSt ...

  2. hadoop入门手册1:hadoop【2.7.1】【多节点】集群配置【必知配置知识1】

    问题导读 1.说说你对集群配置的认识?2.集群配置的配置项你了解多少?3.下面内容让你对集群的配置有了什么新的认识? 目的 目的1:这个文档描述了如何安装配置hadoop集群,从几个节点到上千节点.为 ...

  3. flask第十三篇——url注意事项

    先和大家说一下常用的请求方法 get:只是从服务器获取数据,不会对服务器的状态或数据产生任何影响: get方法的参数是放在URL中传递的. post:会对服务器的状态或数据产生影响:通过body形式进 ...

  4. python scrapy ip代理的设置

    在scrapy项目中建一个与spider同级的python目录并在下面添加一个py文件内容为 # encoding: utf-8import base64proxyServer = 代理服务器地址 # ...

  5. 【C#】datetimepicker初始为空值的方法

    方法一: 在窗口初始化函数中添加: dateTimePickerEnd.Format = DateTimePickerFormat.Custom; dateTimePickerEnd.CustomFo ...

  6. Java Garbage Collection

    在C/C++中,需要自己负责object的creation 和 destruction. 如果忘记了destruction, 就容易出现OutOfMemoryErrors. Java中会有GC直接处理 ...

  7. mysql导入外部sql脚本的方法

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011043843/article/details/29689853 导入的方法分为两种:一是採用图 ...

  8. LuaJavaBridge

    http://www.360doc.com/content/14/0117/13/9200790_345940368.shtml quick目录结构介绍 http://cn.cocos2d-x.org ...

  9. redis+php实现微博功能(三)

    个人主页显示微博列表(自己及关注人的微博列表) /*获取最新的50微博信息列表,列出自己发布的微博及我关注用户的微博 *1.根据推送的信息获取postid *2.根据postid获取发送的信息 */ ...

  10. 类的声明与实例化及构造方法析构方法(PHP学习)

    <?php class human{ public static $leg=2; public $name = 'leo'; public $age = '25'; public functio ...