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

大体思路:
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. JavaWeb向浏览器返回一个音频流

    浏览器直接播放音频文件,1是直接访问一个html的音频文件,,2 是返回一个Java音频流给浏览器解析. 下面实现一个java的wav文件音频流,可以直接播放音频文件 package org.lib. ...

  2. kong 了解

      Kong 是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能.Kong 有两个主要组件: Kong Server :基于nginx  的服务器,用来接收 API 请求. Apac ...

  3. Eclipse导入工程后,XDoclet错误:Missing library: xdoclet-1.2.1.jar. Select the home directory for XDoclet

    这几天在使用Open Health Tools的OpenXDS工程,在导入Eclipse后,出现下面的错误: 遂google之,在网上找到了答案.答案网址为http://blog.v-s-f.co.u ...

  4. 移动端固定头部和固定左边第一列的实现方案(Vue中实现demo)

    最近移动端做一份报表,需要左右滚动时,固定左边部分:上下滚动时,固定头部部分. 代码在Vue中简单实现 主要思路是: a.左边部分滚动,实时修改右边部分的滚动条高度 b.头部和内容部分都设置固定高度, ...

  5. STL容器的resize方法

    刚才写DFS程序,为了加个创建DFS树然后再次遍历的功能,把初始化的代码给封装到init()函数里,然后直接调用之后对同样是邻接表表示的DFS树进行DFS. 然后令人诧异的是竟然没有打印结果,调试发现 ...

  6. idea之jrebel热部署使用教程

    JRebel是一个J2EE热部署的工具.使用它可以减少浪费8-18%的开发时间在项目的构建和部署上.虽然Java也提供了HotSpot的JVM,但是如果你修改的类中有方法名称变动的话,HotSpot就 ...

  7. FPGA设计者必须精通的5项基本功

    FPGA设计者的5项基本功:仿真.综合.时序分析.调试.验证. 对于FPGA设计者来说,练好这5项基本功,与用好相应的EDA工具是同一过程,对应关系如下: 1. 仿真:Modelsim, Quartu ...

  8. Codeforces-591C题解

    一.题目链接 http://codeforces.com/problemset/problem/591/C 二.题意 给定一个只含数字0和1的数组,通过如下方式,变成不再变化的01组合,最少需要操作几 ...

  9. jdbc调用sparksql on yarn

    spark sql访问hive表 1.将hive-site.xml拷贝到spark目录下conf文件夹 2.(非必需)将mysql的jar包引入到spark的classpath,方式有如下两种: 方式 ...

  10. Java垃圾回收机制和内存分配

    收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现 自动内存管理解决的是:给对象分配内存 以及 回收分配给对象的内存 为什么我们要了解学习 GC 与内存分配呢? 在 JVM 自动内存管理机制的 ...