前言
工作需要,在空闲时间看了下Cocos2d-JS的热更新。对其进行了一个简单的实现,这里总结分享一下。
Cocos2d-JS 热更新
Cocos2d-JS 热更新是啥?Cocos2d-JS终归还是一个游戏引擎,就以游戏的过程来理解吧。传统游戏需要更新人物动画、地图场景、游戏逻辑、背景音乐怎么办?新出一个APP放到应用商店等用户下载,或者好一点游戏内提示又升级并自行下载完整的新版本APP。
使用Cocos2d-JS的热更新,那就大不一样了。它可以做到进入游戏后下载需要更新的资源甚至是脚本本身,而且更新过程不需要退出游戏。只要用户联网,就能够保证使用到最新的资源。
这些场景就非常适合使用Hot Fix
-
想在游戏中对春节开放新活动,不能保证应用商店能准时过审核上线
-
发现一个严重的Bug,需要立即修复
-
需要经常换游戏资源,提升新鲜感
-
先放一个中规中矩的版本过市场审核,然后绕过审核自己直接推新内容,哈哈
对于游戏来说,这个特性是比较重量级的。不过因为JavaScript的语言特性能支持这一功能,所以Cocos2d-JS能用此特性,而Cocos2d-x无法使用。
特性
以下是官方提供的特性
-
多线程并行下载支持
-
两层进度统计信息:文件级以及字节级
-
Zip压缩文件支持
-
断点续传
-
详细的错误报告
-
文件下载失败重试支持
Simple
1. manifest配置文件
热更新需要用到的配置文件有2种,都是以.manifest结尾。
一种是精简版,一种是完整版。精简版称为version.manifest,完整版称为project.manifest。
version.manifest:
1
2
3
4
5
6
7
8
9
10
11
|
{
"version"
:
"1.0.0"
,
"groupVersions"
: {
"1"
:
"1.0.1"
,
"2"
:
"1.0.2"
},
"engineVersion"
:
"3.3"
}
|
version.manifest是可选的,其中的所有字段也出现在project.manifest中,并且内容一样,如果没有就会从服务端下载完整版。但是如果完整版特别大,那么这个小版本的优势就很明显了。
project.manifest:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
{
"version"
:
"1.0.0"
,
"groupVersions"
: {
"1"
:
"1.0.1"
,
"2"
:
"1.0.2"
},
"engineVersion"
:
"3.3"
,
"assets"
: {
"update1"
: {
"path"
:
"src/app.zip"
,
"md5"
:
"41D8E948052B5B714B14F81612CF534D"
,
"compressed"
:
true
,
"group"
:
"1"
},
"update2"
: {
"path"
:
"res/HelloWorld.png"
,
"md5"
:
"A0FA3FA681D500575012D5E802F74D50"
,
"group"
:
"1"
},
"update3"
: {
"path"
:
"res/Bound.png"
,
"md5"
:
"E7D4218B02CD0C5BB35ADC55E133DBA2"
,
"group"
:
"1"
},
"update4"
: {
"path"
:
"src/resource.js"
,
"md5"
:
"BA47101EBB65FBFCFB61C4CC57A306CA"
,
"group"
:
"2"
}
},
"searchPaths"
: [
"res/"
]
}
所有字段具体含义,官方文档的定义还是比较详细,只是少了groupVersions这个新字段:
以我的配置为例,一个完整的更新流程是这样的: 先通过本地的version.manifest和服务端的version.manifest比较,如果本地version低于服务端,那么就会再去获取project.manifest。 如果version相同,那么会比较groupVersions。 如果本地没有下载过groupVersions中的任何更新,那么会依次下载升级包。 如果本地下载过1.0.1版本的升级包,那么就会跳过1.0.1下载属于1.0.2版本的升级内容。 如果下载失败,或者没有网络导致更新失败的,会继续使用未更新前的版本。并且下次启动会继续尝试更新。 2. 创建后台 用一种你喜欢的方式起一个后台服务。我朴实无华的用IDE(Eclipse for JavaEE)建立了一个空的Web工程,用Tomcat起了一个后台。 从刚才的配置文件可以看出,Web工程名为JsUpdateServer。 在WebContent的根目录下新建一个index.html文件,随便在里边写些东西,用来验证我的后台已经起来。 Run起来之后,在浏览器里输入http://localhost:8080/JsUpdateServer/index.html看看是不是能够看到你刚才写的内容? 到这里你的后台已经OK了~ 3. 创建Cocos2d-JS工程 新建一个Cocos2d-JS工程,可以用专用的IDE(Cocos Code IDE),官网有下载,也有如何配置的教程,这里就不多说了。 在res目录下,新建一个project.manifest文件。这个是初始版本信息,之后的更新会用到这个文件。内容如下:
在src目录下,新建一个jsList.js文件,内容如下:
这个文件里包括的是需要加载的js文件路径,将会在其他地方加载。 在src目录下,新建一个assetsManagerScene.js文件,这里就是热更新的主要逻辑了。代码如下:
|