cocos2d-x jsbinding 在线更新策略设计
在线更新是用脚本编写游戏逻辑的特有功能,由于脚本语言是边解释边编译的特性,使得游戏在运行的时候可以通过下载最新的脚本来执行游戏逻辑。在不修改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 在线更新策略设计的更多相关文章
- 策略设计测试用例实践(2)--Pairwise(转)
一.关于”好的“测试用例 在设计测试用例的时候有多种设计方法和策略可以使用,使得测试用例设计得更丰富,尽可能覆盖到更多的程序路径和功能场景.常见的测试用例设计方法被提到最多的就是等价类划分.边界值分析 ...
- Redis缓存策略设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...
- 学生信息管理系统(cocos2d引擎)——数据结构课程设计
老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite* spBG = CCSprite::create("&qu ...
- 分布式监控系统开发【day38】:报警策略设计(二)
一.策略和动作多对多的好处坏处 1.好处: 相同服务,相同策略的服务可以不用重复写好多次触发器 2.坏处: 1.策略A给小李和小罗发邮件2.策略B给小胡和小崔发邮件3.策略A是第三部发邮件4.策略B是 ...
- DotNET应用架构设计指南 安全 运行管理和通讯策略
DotNET应用架构设计指南(第三章:安全 运行管理和通讯策略(13-16)) 安全 运行管理和通讯策略 组织策略定义的规则是支配应用程序如何安全,如何管理,不同的应用程序组件是如何和另一组件及外部服 ...
- 聊聊从web session的共享到可扩展缓存设计
先从web session的共享说起 许多系统需要提供7*24小时服务,这类系统肯定需要考虑灾备问题,单台服务器如果宕机可能无法立马恢复使用,这必定影响到服务.这个问题对于系统规模来说,从小到大可 ...
- Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)
Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔) Louis Rosenfeld(路易斯·罗森菲尔德) ...
- JAVA 数据权限设计
数据权限设计 前言 在各种系统中.要保证数据对象的安全性以及易操作性,使企业的各业务部门.职能部门可以方便并且高效的协同工作,那么一个好的数据权限管理设计就成为一个关键的问题.尽管企业中各个单元的工作 ...
- GIS性能策略
当一个地理平台上线运行,我们经常会遇到这些问题:1.系统刚上线时速度较快,一段时间后访问较慢?2.在地理平台目前的配置下,发布多少个服务才合理?一个服务配置多少个实例数才合适?这些问题,都涉及整个地理 ...
随机推荐
- 【Android】创建、读取XML文件
创建: package webdomain; import java.io.File; import java.io.FileNotFoundException; import java.io.Fil ...
- Linux-sort用法
本文为转载,原地址:http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html sort命令是帮我们依据不同的数据类型进行排序, ...
- java多线程之 Executors线程池管理
1. 类 Executors 此类中提供的一些方法有: 1.1 public static ExecutorService newCachedThreadPool() 创建一个可根据需要创建新线程的线 ...
- 使用Sunny-grok实现内网转发
Sunny-grok 申请地址:http://www.ngrok.cc ngrok.cfg配置: server_addr: "server.ngrok.cc:4443" auth_ ...
- 【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 ...
- delphi 判断调试状态
DebugHook 该变量在调试状态下值为1,运行模式为0,例如,我们可以使用如下的代码来简单控制: if DebugHook=0 then
- 用UltraISO制作的u盘ubuntu11.04,启动失败解决方案
错误提示:SYSLINUX 3.84 2009-12-18 EBIOS Copyright c 1994-2009 H.Peter Anvin et al 折腾的很久,尝试用Pauly的bootice ...
- POJ 3254 Corn Fields (状压dp)
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...
- 编译安装-Nginx
安装Nginx 1.环境准备 2.创建nginx用户 3.安装pcre-8.33.tar.gz 4.安装nginx-1.5.4.tar.gz 6.开机自启动 安装Nginx 1.环境准备 系统:Cen ...
- Spring REST实践之安全
Securing REST Services 一般有六种方式实现的REST服务的安全: Session-based security HTTP Basic Authentication Digest ...