zoukankan      html  css  js  c++  java
  • 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传入一个相对地址,如果可以在设定的缓存目录或者打包资源中找到该文件,则会返回一个全路径,这个路径必然和相对路径不相同,如果相同,则说明系统在相应的缓存路径和打包资源中不能找到该文件。

         

  • 相关阅读:
    2013.4.15 Particle Swarm Optimization with Skyline Operator for Fast Cloudbased Web Service Composition
    Adaptive service composition in flexible processes
    2013.4.13 DomainSpecific Service Selection for Composite Services
    2013.4.14 Modeling and Algorithms for QoSAware Service Composition in VirtualizationBased Cloud Computing
    2013.5.29 Towards Networkaware Service Composition in the Cloud
    Efficient algorithms for Web services selection with endtoend QoS constraints
    SQL Server中常用的SQL语句
    接口限流自定义注解
    linux服务器生产环境搭建
    MVEL自定义函数重复掉用报错:duplicate function
  • 原文地址:https://www.cnblogs.com/hzd822/p/3258641.html
Copyright © 2011-2022 走看看