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.在地理平台目前的配置下,发布多少个服务才合理?一个服务配置多少个实例数才合适?这些问题,都涉及整个地理 ...
随机推荐
- 【boost】使用lambda表达式和generate_n生成顺序序列
程序中经常用到顺序序列(0,1,2,3,4,5,6.....),一直羡慕python有range这样的函数,而C++中通常只有用循环来处理这种初始化. 现在,结合boost库lambda(虽然差C++ ...
- 让git忽略ignore所有文件,只对某些文件进行版本控制
*.c !frob_*.c !custom.c 或者:*!*/ # 这个的意思是不忽略目录.否则目录被忽略了之后,它里面的所有文件都忽略了!*.c!*.cc!*.cpp!*.cxx 也就是先忽略所有文 ...
- cookie一些简单的操作
cookie 保存数据 document.cookie=name+'='+value+';expires='+date; //name=shiyou ;expires=Tue Mar 08 ...
- 第三百三十二天 how can I 坚持
今天一大早,住的这就施工了,被吵醒了.. 下午去了趟小米之家,小米5还行,黑科技不黑,哈哈. 小米5黑科技不太黑,就知道造词,整体感觉还行,就是感觉屏幕有点长,小米之家人倒是不少,还有老太太去小米之家 ...
- <转>单播,广播,组播的缺点与优点
原文链接:http://apje.blog.163.com/blog/static/145345252007101175714761/ 当前的网络中有三种通讯模式:单播.广播.组播(多播),其中的组播 ...
- HD2029
Palindromes _easy version Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- Linux查找文件夹名
@(编程) find / -type d -name filename type的类型 -type c File is of type c: b block (buffered) special c ...
- python scp
scp 0.10.2 Downloads ↓ scp module for paramiko Pure python scp module====================== The scp. ...
- 通过set和waitOne来控制子线程的运行和停止
public partial class Form1 : Form { //自动重置事件类 //主要用到其两个方法 WaitOne() 和 Set() , 前者阻塞当前线程,后者通知阻塞线程继续往下执 ...
- 操作Cookie的一个陷阱服务器端获取不了maxAge或其它属性
搞了几天终于弄明白了这个问题: 在读取Cookie,然后操作时,除了getName(),getValue()外,不要妄图得到其他信息,如下方法不会得到值的:cookie.getMaxAge();=== ...