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

大体思路:
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. 前端(六):JavaScript面向对象之宿主对象

    宿主对象即浏览器提供的对象,主要包括DOM对象和BOM对象. 一.DOM源起 1.SGML.XML和XHTML SGML(标准通用标记语言)是定义使用标签来表示数据的标记语言的语法. - 标签由一个小 ...

  2. Redis 列表 List 主要操作函数

    /** * redis 列表 List Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部(左边)或者尾部(右边) */ //lpush 新增一个列,多个列可以用空格隔 ...

  3. rollupjs 基本试用

    备注:    前端构建工具   1. 安装 yarn global add rollup yarn global add rollup 2. 基本使用 touch index.js index.js ...

  4. 如何查看你的 FastAdmin 服务器是否开启了 gzip br 压缩

    如何查看你的 FastAdmin 服务器是否开启了 gzip 压缩 gzip br 压缩的好处不用多说了. 但是怎么方便的知道网站到底有没有开启或使用了 gzip 呢,其实只要在浏览器就可以看到. 按 ...

  5. 用vs2010编译vs2013建的工程

    第一步,用文本打开,修改.sln文件 原始: Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2 ...

  6. 方法 中 void 的解释

  7. java代码---实现随机产生1000个随机数,并10个一行的输出

    总结:不会用,就是不熟 package com.s.x; //输入10个随机数,并显示最大值,最小值 import java.util.*; public class Value { public s ...

  8. Docker Rest API使用入门

    Docker Rest API使用入门 系统:Centos7.2, Docker版本信息如下: [python] view plain copy Client: Version:      17.03 ...

  9. 解决jenkins产生的日志过大以及一些衍生问题

          jenkins使用一段时间后,会导致出现比较大的日志问题,经常占满硬盘空间(因为我们使用的硬盘大小20G,无额外存储要求).在硬盘空间占满之后,会导致一些基本的命令都无法使用,譬如tab都 ...

  10. questions information

    1. 面向对象 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 三大特性: 封装: -- 将内容封装到对象中 -- 将方法疯 ...