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

思绪何来



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

由于新项目采用的是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目录下有这个图片),你会在浏览器里看到图片。

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

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

 

结语



热更新对于手机网络游戏研发来说,已经是一项不可或缺的特性。Quick-Cocos2d-x为我们提供了一个可以在纯LUA环境中开发项目的能力。但是,热更新的解决方案需要针对不同的项目需求进行调整,不可一概而论。 我想这也是为什么Quick-Cocos2dx只提供了一个update的DEMO,而并未将其作为框架特性的原因吧。

本文中实现的方案,也仅仅是初试。并未经过大量的项目验证,因此肯定会有许多不妥之处。大家使用过程中,如果有发现问题,请及时反馈。

 

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

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

时间: 2024-11-18 20:38:01

基于Quick-cocos2d-x的资源更新方案 一的相关文章

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

写在前面 又是12点半了,对于一个程序员来说,这是一个黄金时间,精力旺盛,我想,是最适合整理和分享一些思路的时候了. 自从上次写了 基于Quick-cocos2d-x的资源更新方案 同样可见quick-cocos2d-x官方论坛贴子:http://www.cocoachina.com/bbs/read.php?tid=209421&fpage=2 一直觉得有些什么地方不对.思考了许久之后,发现对于framework和update自身模块的更新,是有一定的问题的. 对于update自身模块的更新来

[Unity]AssetBundle资源更新以及多线程下载

前言 此文章适合不太了解资源加载的萌新,有了入门基础之后再去github上搜大牛写的专业的资源加载方案才能得心应手,不然的话会看的很吃力或者说一脸懵逼.Unity里面关于资源加载我们都知道是下载更新AssetBundle,关于AssetBundle我之前的文章已经详细介绍过,没看过的朋友可以在看一下.下面介绍的资源加载的Demo有以下几点: 1.WWW下载图片资源 2.HTTP下载apk文件,并且支持断点续传,并且显示加载进度条 3.HTTP多线程下载文件 部分核心代码和讲解 WWW下载 思路:

浏览器缓存导致FLASH资源更新问题的解决方案

在网上搜浏览器缓存问题时,遇上了很多问题.一是不知道应该用何种关键字搜索,二是一搜出来,就全是讲的是如何禁用浏览器缓存的方案.   作为大型点的FLASH WEBGAME来说,不缓存显然是不行的.总体上来说,我们要想达到的目标就是 一.浏览器需要缓存 二.当服务器资源更新时,浏览器缓存里相应的老版本资源失效.   下面两篇文章讲到了一个很好的解决方案,并且给出了源码..   更新文件避免浏览器缓存的解决方案(基于svn)   http://www.itamt.com/2010/06/browse

云计算-关于集群的自动化配置部署和更新方案

问题描述 关于集群的自动化配置部署和更新方案 先花些时间唠叨下我做的<XX行业生产云>的需求,然后结合着这些需求请教各位专家一系列的问题. 功能需求: 生产企业内部有局域网,连接办公环境和相关的生产设备,并且有连接互联网的出口.生产过程由办公环境(B/S架构)向局域网内的设备发送生产指令,生产的运行状态实时可以回显给办公环境.局域网内满足该需求就需要部署一个常规的Web应用服务站点加关系型数据库(目前尚不需要实时数据库)就可以完成.云计算-关于集群的自动化配置部署和更新方案-集群自动化部署&q

Android热修复升级探索——资源更新之新思路

前言 Android资源的热修复,就是在app不重新安装的情况下,利用下发的补丁包直接更新本app中的资源. 我们在开发阿里云移动热修复(Sophix)的过程中,对Android资源的加载原理做了深入的探究,最终在资源修复方法上取得了突破性进展!新的资源修复方法不论是在使用便捷性.补丁包大小以及运行时效率方面,相比其他实现都有巨大的优势. 普遍的实现方式 目前市面上的很多资源热修复方案基本上都是参考了Instant Run的实现. 首先,我们简单来看一下Instant Run是怎么做到资源热修复

基于Docker &amp; Fabric的Web项目部署方案

本文描述了Web项目的两种部署方案,石器时代的ssh & pull & restart方式不做太多说明 1.基于Fabric(Python)的部署方案 Fabric 是一个用于ssh的Python库&命令行工具 Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or systems administ

行业网站内容优化更新方案

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 对于很多站长朋友来说,或者说对于不少SEO工作者来说,大家接触行业网站的机会还是比较多的.然而在行业网站的内容优化上却出现了太多的问题,为什么长期的坚持却得不到自己想要的效果?在这里守护把行业网站内容优化更新方案分享出来,希望可以给行业站的朋友一些帮助. 行业站在很大程度上是一个专业性比较强的网站,因为行业内的工作人员对网络并不了解,所以网站

指纹识别 门禁系统-基于指纹识别的门禁系统方案

问题描述 基于指纹识别的门禁系统方案 基于指纹识别的门禁系统方案,小弟毕业设计,该怎么做求大神指教,小弟在此谢过!!! 解决方案 这个毕设主要可分为两个部分,软件设计和硬件设计,软件设计主要实现指纹采集,识别功能,硬件设计需要完整这个装置的电路设计. 指纹识别技术现在已经很成熟了,相关论文资料网络上一大堆,你可以找一篇适合自己的就行,还有,指纹识别代码 网络中也可以找到的. 解决方案二: 怎么做?如果你什么都不会,建议你在毕业前学会如何使用google,这是一个文明人而不是山沟中的野蛮人所应该具

基于校验编码备份的分布存储方案

基于校验编码备份的分布存储方案 陈冬晓,王鹏 传统的云计算存储系统为保障可用性,一般使用镜像冗余备份而产生大量冗余备份数据,影响了存储数据空间的利用效率.针对此情况,为减少备份数据对存储空间的占用,提出一种存储方案.放弃了镜像冗余备份,引入校验编码的方式进行备份,以减少备份数据;同时采用了冲突跳转的机制对备份进行验证,在保证备份数据有效性的前提下减少备份数量.通过模拟程序运行结果与主流云存储方案的对比表明,所提存储方案在保证数据可靠性的同时,显著地降低了分布存储对磁盘空间的占用. 关键词:云存储