前两天老大让我实现热更新。没做过。怎么办(心里很慌,打开google压压惊),发现一片好文章特此转载,希望能帮助正在怕坑的程序员门,但凡我转载的文章引用链接都放在开头,表明我尊重作者。特此告示 原文http://www.redblack.cn/?p=8
cocos2d-x热更新
本文是探索cocos-x热更新,其实就是探索cocos-lua或者js的脚本和资源热更新,热更的作用也不用我在这里为大家普及了。
文中主要使用python作为服务器的脚本,lua作为客户端脚本,是用cocos code ide作为开发环境。
在此之前可以参考我之前发表在cocoachina上关于热更新后台的实现,里面大概讲解了实现与原理(文件结构有小小变动,现在增加了项目名称,可以发布多个项目):
http://www.cocoachina.com/bbs/read.php?tid=213054
后台环境:
python 2.7 + webpy0.37
webpy安装:
1、解压webpy,cmd至webpy路径下
2、cmd运行python setup.py install
详细了解webpy,请访问其官网:http://webpy.org/
为了保持客户端最安全与最小化热更新,我们需要判断出每个版本的差异,将差异文件下载到客户端。为了差异识别,我们将生产res与src下所有文件的MD5,并将其保存至相关文件夹,保存内容如下:
src/test1.lua:e6e8feb29a41a0d83c29c834c10a42a2
src/test2.lua:b87957f382a4a292db91bd937b66a000
res/ani/enemy/monster.csb:6a42885d985f777418d97ef956758f2e
res/ani/enemy/monster.exportjson:1c26ec5818281794e98a4d05c3d871c4
后面我们只需要对比客户端当前版本与服务器最新版本的资源列表的md5以及判断哪些是新增文件,这样我们就可最小化获取需要更新的列表。
到此,我们可以将此文件连同当前版本文件放至服务器,让客户端下载更新列表,并在客户端判断需要下载那些文件,但是这样真的好么,如果一次更新n个文件,那样的连接将会有n次,可能是我多虑了。但我考虑到我们的版本不可能无限次发布,因此我决定将版本差异的包放在服务器,这样客户端只用告诉我们他当前什么版本,就可以获取到升级至最新版本的更新包。
比如客户端当前版本为1.0,服务器最新版本为2.0,通过url传至服务器,客户端就可以获取一个1.0升级到2.0的资源包,客户端通过assertManager可以文件解压,我们再将解压目录文件移动至我们的查找目录就ok了。
服务器通过各个版本的资源列表,获取改动和新增的文件,并将其打包压缩至zip文件。而且由于我们发布的版本是确定的,因此这些更新文件在服务器只会生成一次,对服务器来说基本没什么压力,而且我们可以将其预先生成,保存至服务器。
在服务端,我采用如下路径配置:
App:(项目名称)
–project:(保存最新项目资源,手工配置)
—-res:(资源路径)
—-src:(脚本路径)
–publish:(更新包路径,目录下文件自动生成)
—-version.txt (当前最新版本号,手工修改)
—-1.0(1.0版本包)
——list.txt(当前版本1.0的资源列表及MD5)
——update.zip(只有基本版本才会在当前路径层级下有更新包)
—-2.0
——list.txt
——1.0
——–update.zip(1.0升级到2.0需要的更新资源包)
…
我们需要手工配置下project文件,这里面保存我们所发布的最新资源和脚本;publish下保存的是各种版本的更新包。
最终我们运行程序后,可以通过url访问版本与获取更新资源包:
获取最新版本号:http://127.0.0.1:8080/?action=ver
下载更新包:http://127.0.0.1:8080/?action=update.zip&ver=1.1(ver为本地当前版本,url中需要有.zip,cocos2d-x终对url做了判断)
下载地址:http://pan.baidu.com/s/1eQ7WJxK
其余信息可以阅读readme.txt
简单说下思路就是,将客户端当前版本与服务器最新版本做md5比对,将最新版本与客户端版本差异的文件打包,并下载至客户端,完成资源的热更新。
1.如果将资源包完全打包为一个文件,需要下载的文件势必会大很多,每次都会下载很多相同的文体。
2.如果按照版本差异更新,则需要将最新版本的资源包挨个下载一遍,多麻烦呀!
3.如果对服务器文件作md5记录,而单独下载相关文件。这样将会造成复杂的客户端代码,而且每个需要更新的文件都去连接服务器,给服务器造成了压力,而且包的传输肯定要比单个小文件来的快,而且更不容易出错吧!(这完全是个人猜想)
4.第三条也说了,我想让客户端代码变得简单。最简单的方式就是不写或者少些代码,我就想是用cocos-x自带的assertmanager来实现热更新。(其实我是偷懒而已)
说说我认为这样做的好处吧:
1.需要更新的资源减少了。
2.服务器需要保存的版本减少了,只需要保存最新两个版本就ok了。
3.支持版本回退(只需要将上一个版本编号改为最新版本号,并生成更新资源包)。
4.客户端代码减少,并且安全。
——————————————————————————–
今天我带来的是我将之前在cocoachina发表的版本完善后东西,包括服务端与客户端实现:
服务端包含了assertmanager需要的两个链接(版本与包地址的url,而且包地址必须还有.zip这样的字符串,不然会被判断无效,郁闷!)
也有预生成资源包的接口,可以在新版本发布的时候调用,用来生成最新的版本差异包。
客户端代码我是用了cocos code ide,不过也没怎么用它framework里面的东西,修改起来很简单,其实我提供的客户端代码更多算个代码示例(demo)。
废话不多说了。服务端使用可以参考server.zip中的readme.txt。
对了:欢迎大家对我这个新手批评与指正!
————————————下载地址———————————–
server:http://pan.baidu.com/s/1dD8Faxj
client:http://pan.baidu.com/s/1qW16ZZA
——————————————————————————–
注:由于code ide中对lua自带的文件系统lfs不支持,因此我使用了cocos2d-x自带luatest中的文件创建的接口,并将其导出至项目中。因此如果要使用客户端项目时需要注意将createDownloadDir与deleteDownloadDir两个函数导出,c++代码位置为:%engine_root%\tests\lua-tests\project\Classes\lua_assetsmanager_test_sample.cpp(.h),当然你可以选择不创建文件夹,而将更新文件直接解压到可写路径之下!貌似assertmanager可以自己创建存储路径,不过我还未测试。
原文链接:https://www.f2er.com/cocos2dx/341423.html