cocos creator 3.0 中使用二进制的配置文件
使用cocos creator 3.0版本开发游戏,因为要发布h5版本,那么就要考虑游戏加载的过程中资源要小,尤其是配置文件,比如:json文件。json文件的特点是可读性强,如果是navtive没有多大问题,但是对于h5游戏来说,尽量更小是程序开发应该追求的
本文介绍使用压缩工具对json文件进行压缩,cocos creator 3.0进行读取,并且解压读取到正确的数据
1.准备json文件
定义一个json文件大一点,为了展示压缩效果,现定义如下json文件
{
"count":100,
"items":[
{
"id":0,
"type":2,
"point":[
{"x":10,"y":10},
...
]
},
{
"id":1,
"type":3,
"point":[
{"x":100,"y":200},
...
...
]
}
]
}
该文件的大小为97k,稍后我们看压缩效果 假定该文件的名称为 srcpath.json
2.制作压缩工具
使用7z命令对aa.json文件进行压缩,如果对单一文件进行压缩,直接使用命令即可:命令如下:
7z.exe a -tzip desPath.bin srcpath.json
- 以上命令需要7z.exe工具,该工具可以通过安装7z压缩软件获取,在安装目录下就能找到,也可以直接将7z.exe添加到环境变量中。
- -tzip 表示使用zip的方式进行压缩
- desPath.bin 表示压缩后文件文件的路径 至于为什么要保存成为.bing后缀,因为cocos creator 3.0中对二进制文件的识别就是依据后缀来判定的,后边在读取的时候还会说明
- srcpath是文本json文件的路径
以上命令就可以完成将文本json文件转换成功bin后缀的压缩文件。
压缩后文件的大小为:7kb,这个压缩率有10几倍,大大降低了网络传输的压力。
单个文件表现还不明显,如果想捕鱼这样的项目,有几十个鱼表配置,鱼路线配置,压缩后网络加载速度会显著提升。
如果是单一一个或者很少量的json文件,使用上面的命令就可以。但在实际项目的开发过程中,可能会有很多,而且还不会时不时的更新,如果每次转换都使用命令将非常通过。做一个工具,批量生成,将json文件放在一个目录下,转换后的文件放在另外一个目录下。下面介绍使用go语言,遍历json文件的整体目录,将所有的json文件压缩转换成为对应名字的.bin文件
- 思路:使用go语言遍历源目录,使用go语言执行 命令上工具即可
//srcPath问json存放的原始目录,go将遍历该目录
fileInfo,dirErr := ioutil.ReadDir(SrcPath)
if dirErr != nil{
fmt.Println("遍历源路径出现错误")
return
}
for _,v := range fileInfo{
name := v.Name()
if path.Ext(name) ==".json"{
//将json文件进行转换
fileAllName := path.Base(name)
fileSufix := path.Ext(name)
filePrefix := fileAllName[0:len(fileAllName)-len(fileSufix]
//调用cvt2Bin方法
cvt2Bin(SrcPath,DesPath,filePrefix,CmdPath)
}
}
//将单个文件进行压缩
@params src 源路径
@params des 目标路径
@params cmdPath 7z.exe文件所在的路径
func cvt2Bin(src string,des string,name string,cmdPath string){
cmdStr := "%s/7z.exe a -tzip %s %s"
cmdStr = fmt.Sprintf(cmdStr,cmdPath, desPath, srcPath)
cmd := exec.Command("cmd.exe", "/c", cmdStr)
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
fmt.Println("压缩文件到成功",desPath)
}
3.客户端进行加载和读取
通过以上两个步骤,压缩文件已经成功生成。
将aa.bin(假设是这个名字),拖拽到cocos creator项目中的对应目录,加入是 conf/data/aa.bin
假设conf所在的目录是lobby,并且lobby别勾选成了bundle。
通过下面的方法就可以成功加载
@prams fileName
//对于被示例:fielName = conf/data/aa 文件后缀名为.bin但是加载的时候不能带有后缀
assetManager.loadBundle("lobby",(err,bundle:AssetManager.Bundle)=>{
if (err !=null){
console.error("loadBundle failed:",err);
return;
}
bundle.load<BufferAsset>(filename,(err,buff:BufferAsset)=>{
if (err != null){
console.error("load path file err",err);
return;
}
let arr = filename.split("/");
JSZip.loadAsync(buff.buffer()!).then((zip)=>{
zip.file(arr[1]+".json").async("text").then((data)=>{
let json = JSON.parse(data);
//console.log(data);
});
});
});
下面的示例代码有两个地方容易踩坑
- 文件的后缀名
在cocos creator 3.0 中二进制文件的读取是依据后缀名判断的。如果将后缀名设置为其他比如:data,zip,等等 cocos creator 不认为他是二进制数据 以上代码会在 buff.buff() 的地方报错,提示buff没有buff()方法。因为creator不知道这个资源是什么类型。只能默认为asset,而asset是没有buff()方法的 - cocos creator 本身是没有解压缩程序的,需要我们集成第三方的库jszip来进行解压缩。至于jszip库的集成和使用 下面的文章会有详细介绍。