在线更新是用脚本编写游戏逻辑的特有功能,由于脚本语言是边解释边编译的特性,使得游戏在运行的时候可以通过下载最新的脚本来执行游戏逻辑。在不修改Native接口的情况下,在线更新每次更新只需要下载一个(500k-1M)的zip脚本压缩包即可。相比较而言,传统的apk打包或者ios的ipa打包且不说打包花费的时间,用户每次更新必须重新下载整个程序包(一般在30M以上,甚至到几百M),更要命的是ios上传发布必须通过苹果审核,一个审核周期就是至少一周,还有几率被苹果打回,其实有的时候只是修改了一个比较重要的bug而已。

cocos2d-x的CCFileUtil有一个比较重要的功能,就是设定资源的搜索路径,具体的js调用方法为:

// 设定资源搜索路径,优先级为传入数组的顺序
cc.FileUtils.getInstance().setSearchPath([cachePath]); // 添加一个资源搜索路径,优先级排在最后
cc.FileUtils.getInstance().addSearchPath(cachePath);

资源是指:脚本代码,图片纹理,声音,plist,配置文件等。。

同时,资源又细分为打包资源和缓存资源。

打包资源:顾名思义,导入ipa或者apk中的资源,玩家下载程序包后就包含了这些资源数据。这些资源可以在游戏程序包的中找到

缓存资源:当进入游戏后,在游戏过程中联网下载了一个资源,该资源会被存入一个缓存目录,下次读取相同的资源后,玩家就不用再次联网下载了,转而读取缓存目录的资源。

游戏是如何判断缓存目录中的资源文件呢?这里就要用到上面提到的资源搜索路径。

正常情况下,我在游戏中创建一个sprite。

var sprite = cc.Sprite.create('res/images/test.png');

这个时候系统会去在打包资源目录下搜索'res/images/test.png',如果没有这个图片的话,就会抛出异常,当使用了FileUtil的资源搜索路径后,系统会根据配置的资源路径来找资源

cc.FileUtils.getInstance().setSearchPath([cachePath]);

当设定了资源搜索路径后系统先在cachePath/res/images/test.png 寻找资源,如果没有找到,再到打包资源目录下的res/images/test.png寻找

cc.FileUtils.getInstance().addSearchPath(cachePath);

追加资源搜索路径后,系统也会在cache目录下寻找资源,只是优先级比打包资源目录要低,是先搜索打包资源目录,如果没有的话再搜索设定的资源路径。

在实际的游戏中,我们一般会使用setSearchPath方法,优先寻找缓存资源目录,再搜索打包资源目录,这样如果我们有新的资源改动,我们只要将新的资源下载到对应的缓存目录,游戏就会读到最新的资源,从而实现在线更新。

上面写了一些更新资源的方法,下面来聊一聊如何去设计这些更新步骤。

一般我们要更新的资源为:脚本js文件,配置文件,缓存图片等。js和配置文件大家都很清楚,为什么要更新缓存图片呢?因为在玩家游戏的过程中会下载很多额外的图片,这些图片都没有打到程序包里面,如果全部打进去,这样整个包就会无比庞大,玩家一般能够接受的程序包大小只有30M-100M左右,当然这个根据游戏而定。但是实际整个游戏资源是在300M以上甚至更多,所以大部分的图片资源还是要进游戏下载的。这就出现了一个问题,某个版本升级以后我修改了某张图片,但是这张图片已经被玩家缓存,这个时候按照资源下载判断的逻辑,发现有该图片在玩家的缓存目录就不会去下载,但这样就会造成和最新的版本不一致,所以我们要想办法将这张旧的缓存图片移除,这样的话等用到这张图片,系统会从网络上下载最新的图,这个是和最新版本符合的,从而保证了版本的一致性。

为了能够迭代更新资源,我设定了一个资源更新配置大致结构如下

version.js
game.version = '1.0.114'; game.versionInfo = {
'1.0.66':{res:['res/images/ui/ui1.png']},
'1.0.86':{cfg:['cfg1.js']},
'1.0.93':{cfg:['cfg2.js']}
};

game.version 是整体的游戏版本号,game.versionInfo是需要更新的配置表,前面的key表示在该版本号下面需要更新的内容。

整个更新流程如下:

1.启动游戏下载version.js 比较当前版本号(存放在localstorge中)与game.version,如果一致,则直接进入游戏。否则下载最新的js压缩包继续往下执行

2.循环game.versionInfo 中的版本号与当前版本号,如果当前版本号比game.versionInfo的版本好要小,则记录cfg和res信息。

3.根据上述循环获得的res记录,表示新版本更新了缓存图片,则循环res数组删除缓存目录下的图片,以便读取该图片时下载最新的图片

4.根据上述循环获得的cfg记录,表示新版本更新了配置文件,则循环cdg数组下载指定的cdg存放在缓存目录下,以便读取该cfg时,获得的是最新的配置。

小技巧:如何用js判断某个文件是否在缓存目录中,或者在打包目录中

resInfo.src == fileUtils.fullPathForFilename(path)

fullPathForFilename传入一个相对地址,如果可以在设定的缓存目录或者打包资源中找到该文件,则会返回一个全路径,这个路径必然和相对路径不相同,如果相同,则说明系统在相应的缓存路径和打包资源中不能找到该文件。

cocos2d-x jsbinding 在线更新策略设计的更多相关文章

  1. 策略设计测试用例实践(2)--Pairwise(转)

    一.关于”好的“测试用例 在设计测试用例的时候有多种设计方法和策略可以使用,使得测试用例设计得更丰富,尽可能覆盖到更多的程序路径和功能场景.常见的测试用例设计方法被提到最多的就是等价类划分.边界值分析 ...

  2. Redis缓存策略设计及常见问题

    Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...

  3. 学生信息管理系统(cocos2d引擎)——数据结构课程设计

    老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite*  spBG = CCSprite::create("&qu ...

  4. 分布式监控系统开发【day38】:报警策略设计(二)

    一.策略和动作多对多的好处坏处 1.好处: 相同服务,相同策略的服务可以不用重复写好多次触发器 2.坏处: 1.策略A给小李和小罗发邮件2.策略B给小胡和小崔发邮件3.策略A是第三部发邮件4.策略B是 ...

  5. DotNET应用架构设计指南 安全 运行管理和通讯策略

    DotNET应用架构设计指南(第三章:安全 运行管理和通讯策略(13-16)) 安全 运行管理和通讯策略 组织策略定义的规则是支配应用程序如何安全,如何管理,不同的应用程序组件是如何和另一组件及外部服 ...

  6. 聊聊从web session的共享到可扩展缓存设计

    先从web session的共享说起   许多系统需要提供7*24小时服务,这类系统肯定需要考虑灾备问题,单台服务器如果宕机可能无法立马恢复使用,这必定影响到服务.这个问题对于系统规模来说,从小到大可 ...

  7. Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)

    Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔)  Louis Rosenfeld(路易斯·罗森菲尔德) ...

  8. JAVA 数据权限设计

    数据权限设计 前言 在各种系统中.要保证数据对象的安全性以及易操作性,使企业的各业务部门.职能部门可以方便并且高效的协同工作,那么一个好的数据权限管理设计就成为一个关键的问题.尽管企业中各个单元的工作 ...

  9. GIS性能策略

    当一个地理平台上线运行,我们经常会遇到这些问题:1.系统刚上线时速度较快,一段时间后访问较慢?2.在地理平台目前的配置下,发布多少个服务才合理?一个服务配置多少个实例数才合适?这些问题,都涉及整个地理 ...

随机推荐

  1. 【Android】创建、读取XML文件

    创建: package webdomain; import java.io.File; import java.io.FileNotFoundException; import java.io.Fil ...

  2. Linux-sort用法

    本文为转载,原地址:http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html sort命令是帮我们依据不同的数据类型进行排序, ...

  3. java多线程之 Executors线程池管理

    1. 类 Executors 此类中提供的一些方法有: 1.1 public static ExecutorService newCachedThreadPool() 创建一个可根据需要创建新线程的线 ...

  4. 使用Sunny-grok实现内网转发

    Sunny-grok 申请地址:http://www.ngrok.cc ngrok.cfg配置: server_addr: "server.ngrok.cc:4443" auth_ ...

  5. 【Excel】Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046}:

    [Excel]Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-0000000000 ...

  6. delphi 判断调试状态

    DebugHook 该变量在调试状态下值为1,运行模式为0,例如,我们可以使用如下的代码来简单控制: if DebugHook=0 then

  7. 用UltraISO制作的u盘ubuntu11.04,启动失败解决方案

    错误提示:SYSLINUX 3.84 2009-12-18 EBIOS Copyright c 1994-2009 H.Peter Anvin et al 折腾的很久,尝试用Pauly的bootice ...

  8. POJ 3254 Corn Fields (状压dp)

    题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...

  9. 编译安装-Nginx

    安装Nginx 1.环境准备 2.创建nginx用户 3.安装pcre-8.33.tar.gz 4.安装nginx-1.5.4.tar.gz 6.开机自启动 安装Nginx 1.环境准备 系统:Cen ...

  10. Spring REST实践之安全

    Securing REST Services 一般有六种方式实现的REST服务的安全: Session-based security HTTP Basic Authentication Digest ...