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中利用 ViewPage 实现滑动屏
最近实现了这样的一个效果:滑动界面出现拖拽效果,可翻动3屏,也可点击按钮翻动页面. 主要利用android.support.v4.view.ViewPager控件来实现. 第一个界面: 滑动屏幕: 换 ...
- <bgsound>和<embed></embed>标签 頁面插入音樂
■ <BGSOUND> 是用以插入背景音乐,但只适用於 IE,其参数设定不多. <BGSOUND src="liberation.mp3"; autostart= ...
- iOS App中数据加载的6种方式
我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...
- 类的大小——sizeof 的研究
类的大小——sizeof 的研究(1) 先看一个空的类占多少空间? class Base { public: Base(); ~Base(); }; 注意到我这里显示声明了构造跟析构,但是sizeof ...
- js中location.search、split()HTML5中localStorage
1. location.search在客户端获取Url参数的方法 location.search是从当前URL的?号开始的字符串 如:http://www.baidu.com/s?wd=baidu&a ...
- Oracle 游标使用(转)
这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试 ; ; dbms_output.put_line(sql) loop dbms_output.put_line( ; ; ; r_te ...
- erlang代码片段
转载自http://blog.csdn.net/sw2wolf/article/details/6797708 .列表操作 lists:foreach(fun(X) -> io:format(& ...
- iOS 8自动调整UITableView和UICollectionView布局
本文转载自:http://tech.techweb.com.cn/thread-635784-1-1.html 本文讲述了UITableView.UICollectionView实现 self-siz ...
- HDU 5703 Desert (找规律)
题意:一杯水有n的容量,问有多少种方法可以喝完. 析:找规律,找出前几个就发现规律了,就是2的多少次幂. 代码如下: #include <cstdio> #include <stri ...
- 利用一些码农Trick去搞一搞G和T的单词
根据自然语言处理中的Zipf统计定律,在自然语言的语料库里,一个单词出现的频率与它在频率表里的排名成反比.因此,我们有理由认为,可以根据这个频率表进行一下排序,以及purning.由于精力有限,没有足 ...