文档章节

基于Quick-cocos2d-x的资源更新方案 一

piggybear
 piggybear
发布于 2015/02/16 10:32
字数 1848
阅读 7
收藏 0
点赞 0
评论 0

昨天写了一篇关于更新方案的理论 游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游) 今天继续细化一下

由于新项目采用的是Quick-cocos2d-x,那我就直接给出我基于Quick-cocos2d-x-master( > 2.2.3 rc) 的更新方案吧

 

此更新方案要解决以下几个问题

一、资源、代码在线更新

二、framework、update模块自更新

三、玩家安装新版本后,减少不必要的更新

四、更新中断的处理

五、Quick-cocos2d-x中,遇上的问题

 

做到上面几点后,我觉得整个更新方案应该没有大问题了。

在说更新流程前,我先说说安装包的内容

首先,我们这里会涉及一个大版本号,大版本号的意思,就是C++部分的版本号,如果有变动,这个版本号才会动。 以提示用户去APPSTORE下载新的版本

其余的版本号,只是一个显示版本号,可以根据游戏内容来区分。

 

每一个安装包本身,包含了所有游戏资源。即一个新版本发布后,玩家是不需要更新的。点开即玩。

安装包内部带了一个文件列表,内容如下

1
2
3
local flist = {
   core = 1
   version =  "1.0.1"
1
update_md5 =  "xxxxxx"
1
2
3
4
5
6
 framework_md5 =  "xxxxxx" <br>
   files = {
        {path= "ui/shop/shop_close_btn.png" ,md5= "xxxxxx" ,size= "30" },
        {path= "ui/army/army_tip.png" ,md5= "xxxxxx" ,size= "20" }
   }      
}<br> return  flist

这是一个LUA文件,之所以使用LUA文件,是为了在LUA中使用dofile方便读取。而files里面,列出了所有包内的文件。 core就是我们刚刚提到的大版本号。

上面的 path,是相对于res的路径,且带完整目录和文件后缀

 

资源服务器上也有一份同样的资源列表。

 

服务器和安装包中的结构如下

res/flist 资源列表

res/update.bin 这个是update模块自己的打包

res/framework.bin这个是quick-framework的打包

res/game.bin这个是游戏逻辑的打包

res/.....  其它游戏资源

更新流程大致如下

1、从服务器取得版本列表(flist)

2、检查update的md5值,看是否有更新,如果有更新,则下载update.bin,重新载入,并退到main(退出之前,注意清除对某些的引用),再次重新进入

3、检查framework的md5值,看是否有更新,如果有更新,则下载framework.bin,并提示用户重新启动

4、读取本地安装目录的版本列表文件(flist)

5、比对服务器版本列表和本地安装目录列表中的大版本号,如果大版本号不一样,则提示用户去APPSTORE上下载。

6、读取upd目录的版本列表文件(flist),如果flist文件不存在,或者flist中存放的core与安装目录列表中的不一致(表示用户安装了新版本),则清除整个upd目录,并将本地安装目录的flist内容,写入upd目录

 

7、对比服务器列表与本地列表中的version(由上一步可以得到),如果version相同,则认为数据是不需要更新的

8、如果version不同,则与服务器的flist对行md5差异对比,得到需要更新的文件

9、遍历需要更新的文件列表,若upd存在,则效验其MD5值,如果MD5值与服务器的相同,则从待更新列表中移除(这一步,是为了应对上一次更新过程中,玩家中途退出的情况)

10、逐个更新文件,每个文件更新完毕后,再次效验其MD5码,如果MD5码效验失败,则重新下载此文件

11、待所有文件更新完毕,重写upd文件中的flist

12、进入游戏

 

资源的下载是OK了,我们如何来做更新呢,如何能够使程序加载到正确的资源。为了正确更新资源,我们可以通过路径搜索来实现

 

--add update path

CCFileUtils:sharedFileUtils():addSearchPath(device.writablePath.."upd/")

--add res path for install

CCFileUtils:sharedFileUtils():addSearchPath("res/")

 

假设device.writablePath的目录是 /data/data/com.ooxx.game1/  那,第一个目录就是/data/data/com.ooxx.game1/upd/ 第二个目录是 res/

在ANDROID和IOS上,如果它检查是以 / 开头的,则认为是绝对路径,直接与文件名合并,生成对应的完整路径

如果不是以 / 开头的,那在IOS上的工作原理和WINDOWS一个样,在ANDROID上,他会先检查是否以assets开头,如果不是,则强加上 "assets/" 并去APK里面搜索

总之,上面的两个路径,是在任何地方都适合的。

 

以上就是我综合了阳光七月,yezehui200,GcvqrNq等人的更新方案而得出的自己的更新流程,上面的流程,几乎解决了本文开头就提出的问题。

下面我来说说我在实现这一方案中,遇上的问题

第一次遇上的问题,是执行安装目录中的flist. 因为dofile会认一个绝对路径,我在WINDOWS上是很OK的,但是在ANDROID上死活都不行,即使我硬编码 dofile("assets/res/flist") 其原因是因为,在ANDROID上,读取资源是从APK压缩包中读取的。

后来我只有通过一个比较矬的方法来优美地解决 就是使用CCFileUtils:sharedFileUtils:getFileData(“res/flist”) ,将得到的数据写入存储卡上,再dofile

由于upd目录下是没有res文件夹的,因此,我们可以保证,这货取得的肯定是安装包下的文件路径。 这样就解决了dofile在ANDROID上的问题。

而要想取安装上下的资源,就只能像这样 dofile(device.writablePath.."upd/flist")

总之,在添加了多路径搜索后,对路径的使用就要格外小心。

 

第二个问题,就是我在测试crypto.md5file的时候,发现,在ANDROID上,如果我们要取一个APK中的文件时,是会失败的,原因就是在C++实现里,它使用了fopen来打开文件,这在ANDROID上是做不到读取APK中文件的。 好在这个需求不需要了。

 

第三个问题,由于没有使用AssetManager,因此,目前还没有实现单个文件的进度条,到时候可能会参考一下AssetManager的实现

 

第四个问题,目录创建问题, 比如 ui/shop/ 我们直接使用 lfs.mkdir(device.writablePath.."upd/ui/shop/) 是不会成功的,需要一级级向下创建,目前没有找到一次性搞定的方案,说不定使用os.execute的mkdir带参数,可以搞定

咦,递归创建目录的方法找到了
windows下直接 os.execute("mkdir ooxx\\ooxx\\ooxx\\ooxx")
ios,android,mac,linux下,直接 os.execute("mkdir -p ooxx/ooxx/ooxx/ooxx")

 

最后我说说我测试资源服务器的方法。

测试资源服务器最简单的方法,就是网上下载一个nginx,解压,解压后,找到html目录,把资源扔进去,点nginx.exe启动,浏览器输入127.0.0.1,你会发现welcome nginx 输入127.0.0.1/1.png (假设你html目录下有这个图片),你会在浏览器里看到图片。

剩下的,就爱怎么整怎么整了。

 

如果是手机测试,最好是把内网的防火墙关了,否则连接不上。

转自:http://www.cnblogs.com/geniusalex/p/3805232.html

© 著作权归作者所有

共有 人打赏支持
piggybear
粉丝 3
博文 237
码字总数 37552
作品 0
西安
技术主管
quick-cocos2d-x基于源码加密打包功能的更新策略(3)

前篇: quick-cocos2d-x基于源码加密打包功能的更新策略(1) quick-cocos2d-x基于源码加密打包功能的更新策略(2) 三、更新流程说明及特性分析 A.更新流程 加载初始安装包,载入旧资源列表 取最...

SunLightJuly ⋅ 2013/12/05 ⋅ 8

基于Quick-cocos2d-x的资源更新方案

昨天写了一篇关于更新方案的理论 游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游) 今天继续细化一下 由于新项目采用的是Quick-cocos2d-x,那我就直接给出我基于Quick-cocos2d-x...

shezjl ⋅ 2015/06/16 ⋅ 0

quick-cocos2d-x基于源码加密打包功能的更新策略(2)

前一篇:quick-cocos2d-x基于源码加密打包功能的更新策略(1) 二、更新原理讨论及更复杂的更新功能 1.更新原理 在前面的更新过程中,从服务器取文件列表,并根据文件列表再更新相关的文件,这...

SunLightJuly ⋅ 2013/12/02 ⋅ 50

游戏快速开发框架--quick-cocos2d-x

quick-cocos2d-x 是一个游戏快速开发框架,基于 cocos2d-x,使用 Lua 来编写移动游戏。 对于初次接触 quick 的开发者,建议直接用 player 模拟器执行 quick 附带的示例程序。然后通过修改、完...

红薯 ⋅ 2013/11/18 ⋅ 3

quick-cocos2d-x基于源码加密打包功能的更新策略(1)

Quick-cocos2d-x增加了编译及加密源代码的功能(具体可参考这篇文章)。以此功能为基础,我实现了一个版本更新模块,解决了自己项目中的版本更新需求。现抛砖引玉,与大家分享。 从基本原理和方...

SunLightJuly ⋅ 2013/12/01 ⋅ 70

quick-cocos2d-x图片资源加密(续)

前篇: quick-cocos2d-x图片资源加密 让quick-cocos2d-x支持加密的plist文件 通过前篇的修改,我们已经能够在Windows平台的player,以及Android上使用加密的常见格式(png、jpg等)的图片资源了...

SunLightJuly ⋅ 2014/01/03 ⋅ 4

quick-cocos2d-x for mac开发环境安装配置

我的开发环境 操作系统:mac Cocos2d-x:v3.2 Cocos2d-lua(quick-cocos2d-x):v3.2-RC1 Cocos Studio:v2.0.2 Cocos Code IDE :v1.0.1(64bit) 安装步骤 安装Cocos2d-x 把下载好的cocos2d......

贪睡猫仙mosen ⋅ 2014/11/30 ⋅ 0

iMeteOra/cocos2d-x-qt

cocos2d-x-3.0alpha 中看到了Qt后端支持, 把它的.pro收纳囊肿! 其它的, 看有啥可以借鉴的吧. quick-cocos2d-x 是一个可以让您觉得“爽快”的 cocos2d-x 的扩展版。基于 cocos2d-x,完全的跨平...

iMeteOra ⋅ 2014/04/28 ⋅ 0

ScutSDK 0.9 版本发布

ScutSDK 简介: ScutSDK 是和 Scut 游戏服务器引擎,简化客户端开发的配套 SDK,她彻底打通了 Scut 开源游戏服务器引擎与客户端引擎(如Cocos2d-x/Quick-x/Unity3D)项目间的通信,进而实现整...

ScutGame ⋅ 2013/12/21 ⋅ 0

Orion/Quick-Cocos2dx-Community

Quick-Cocos2dx-Community Quick-Cocos2dx-Community 发展自用户公认的最稳定版本 Quick-Cocos2d-x v3.3。由于官方疏于维护,并表示不在发布v3.5以后的版本。原作者因为公司战略调整和所属部...

Orion ⋅ 2017/02/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启远程SSH

SSH默认没有开启账号密码登陆,需要再配置表中修改: vim /etc/ssh/sshd_configPermitRootLogin yes #是否可以使用root账户登陆PasswordAuthentication yes #是都开启密码登陆ser...

Kefy ⋅ 9分钟前 ⋅ 0

Zookeeper3.4.11+Hadoop2.7.6+Hbase2.0.0搭建分布式集群

有段时间没更新博客了,趁着最近有点时间,来完成之前关于集群部署方面的知识。今天主要讲一讲Zookeeper+Hadoop+Hbase分布式集群的搭建,在我前几篇的集群搭建的博客中已经分别讲过了Zookeep...

海岸线的曙光 ⋅ 16分钟前 ⋅ 0

js保留两位小数方法总结

本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容: 一、我们首先从经典的“四舍五入”算法讲起 1、四舍五入的情况...

孟飞阳 ⋅ 34分钟前 ⋅ 0

python log

python log 处理方式 log_demo.py: 日志代码。 #! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "Q1mi""""logging配置"""import osimport logging.config# 定义三种......

inidcard ⋅ 49分钟前 ⋅ 0

mysql 中的信息数据库以及 shell 查询 sql

Information_schema 是 MySQL 自带的信息数据库,里面的“表”保存着服务器当前的实时信息。它提供了访问数据库元数据的方式。 什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,...

blackfoxya ⋅ 51分钟前 ⋅ 0

maven配置阿里云镜像享受飞的感觉

1.在maven目录下的conf/setting.xml中找到mirrors添加如下内容,对所有使用改maven打包的项目生效。 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al......

kalnkaya ⋅ 51分钟前 ⋅ 0

centos7下创建新用户并授权

1、创建新用户 创建一个用户名为:test adduser test 创建初始密码: passwd test 2、授予root权限 个人用户的权限只可以在/home/test下有完整权限,其他目录要看别人授权。而经常需要roo...

xixingzhe ⋅ 55分钟前 ⋅ 0

求助:TiledMap如何旋转对象呢?

比如我要旋转一个梯子的角度,单纯在TiledMap旋转角度好像没有效果。那是要用代码来控制角度,还是说只能通过导入相对应的斜的图片才可以呢?

花谢自相惜 ⋅ 56分钟前 ⋅ 0

Micronaut 之HelloWorld!

小试一下Micronaut,按照官方文档跑了一下helloworld 第一步克隆,按照官方文档是: git clone git@github.com:micronaut-projects/micronaut-core.git 结果怎么是这样?? 换个方法吧 git ...

桂哥 ⋅ 今天 ⋅ 0

pom文件

Aeroever ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部