cocos creator 3.0 中使用二进制的配置文件

使用cocos creator 3.0版本开发游戏,因为要发布h5版本,那么就要考虑游戏加载的过程中资源要小,尤其是配置文件,比如:json文件。json文件的特点是可读性强,如果是navtive没有多大问题,但是对于h5游戏来说,尽量更小是程序开发应该追求的


本文介绍使用压缩工具对json文件进行压缩,cocos creator 3.0进行读取,并且解压读取到正确的数据

1.准备json文件

定义一个json文件大一点,为了展示压缩效果,现定义如下json文件

  1. {
  2. "count":100,
  3. "items":[
  4. {
  5. "id":0,
  6. "type":2,
  7. "point":[
  8. {"x":10,"y":10},
  9. ...
  10. ]
  11. },
  12. {
  13. "id":1,
  14. "type":3,
  15. "point":[
  16. {"x":100,"y":200},
  17. ...
  18. ...
  19. ]
  20. }
  21. ]
  22. }

该文件的大小为97k,稍后我们看压缩效果 假定该文件的名称为 srcpath.json

2.制作压缩工具

使用7z命令对aa.json文件进行压缩,如果对单一文件进行压缩,直接使用命令即可:命令如下:

  1. 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语言执行 命令上工具即可
    1. //srcPath问json存放的原始目录,go将遍历该目录
    2. fileInfo,dirErr := ioutil.ReadDir(SrcPath)
    3. if dirErr != nil{
    4. fmt.Println("遍历源路径出现错误")
    5. return
    6. }
    7. for _,v := range fileInfo{
    8. name := v.Name()
    9. if path.Ext(name) ==".json"{
    10. //将json文件进行转换
    11. fileAllName := path.Base(name)
    12. fileSufix := path.Ext(name)
    13. filePrefix := fileAllName[0:len(fileAllName)-len(fileSufix]
    14. //调用cvt2Bin方法
    15. cvt2Bin(SrcPath,DesPath,filePrefix,CmdPath)
    16. }
    17. }
    18. //将单个文件进行压缩
    19. @params src 源路径
    20. @params des 目标路径
    21. @params cmdPath 7z.exe文件所在的路径
    22. func cvt2Bin(src string,des string,name string,cmdPath string){
    23. cmdStr := "%s/7z.exe a -tzip %s %s"
    24. cmdStr = fmt.Sprintf(cmdStr,cmdPath, desPath, srcPath)
    25. cmd := exec.Command("cmd.exe", "/c", cmdStr)
    26. err := cmd.Run()
    27. if err != nil {
    28. fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
    29. return
    30. }
    31. fmt.Println("压缩文件到成功",desPath)
    32. }

3.客户端进行加载和读取

通过以上两个步骤,压缩文件已经成功生成。
将aa.bin(假设是这个名字),拖拽到cocos creator项目中的对应目录,加入是 conf/data/aa.bin
假设conf所在的目录是lobby,并且lobby别勾选成了bundle。
通过下面的方法就可以成功加载

  1. @prams fileName
  2. //对于被示例:fielName = conf/data/aa 文件后缀名为.bin但是加载的时候不能带有后缀
  3. assetManager.loadBundle("lobby",(err,bundle:AssetManager.Bundle)=>{
  4. if (err !=null){
  5. console.error("loadBundle failed:",err);
  6. return;
  7. }
  8. bundle.load<BufferAsset>(filename,(err,buff:BufferAsset)=>{
  9. if (err != null){
  10. console.error("load path file err",err);
  11. return;
  12. }
  13. let arr = filename.split("/");
  14. JSZip.loadAsync(buff.buffer()!).then((zip)=>{
  15. zip.file(arr[1]+".json").async("text").then((data)=>{
  16. let json = JSON.parse(data);
  17. //console.log(data);
  18. });
  19. });
  20. });

下面的示例代码有两个地方容易踩坑

  • 文件的后缀名
    在cocos creator 3.0 中二进制文件的读取是依据后缀名判断的。如果将后缀名设置为其他比如:data,zip,等等 cocos creator 不认为他是二进制数据 以上代码会在 buff.buff() 的地方报错,提示buff没有buff()方法。因为creator不知道这个资源是什么类型。只能默认为asset,而asset是没有buff()方法的
  • cocos creator 本身是没有解压缩程序的,需要我们集成第三方的库jszip来进行解压缩。至于jszip库的集成和使用 下面的文章会有详细介绍。
2021-07-13 14:45:54  user 阅读(933) 评论(0) 标签:cocos creator 3.0,json配置文件,go语言批量压缩工具,jszip 分类:随笔/杂项