Egret社区
1.  配置在preload组中,直接一个个网络加载,因为本身不大,所以 哪怕开启缓存 也不会很卡,只要 记得 在缓存中开启异步存储
    优点:开发&配置 简单~如果把加载与解析绑定,也就是说 每加载到本地一个文件,就解析他,并发运行,也不会很卡,主要还是卡在 缓存的写文件上。
    缺点:费流量,但也不会差多少,大概就是 5M 与500K的区别,人数大了才要省,才每人多1块一个月不到。
    还有一点就是以100个文件为例,我的计算是 5ms * 100 / 10 = 50ms的 最小总下载延时,加上解析与存储,也不会大于500ms。实际效果 差不多 还好一点,不过 公司网好,
    不太好的网络,稍稍有点差别。
2.   第二种就是 使用wx的unzip,他的思路是 加载 某地资源,并解析,然后 存为本地文件,存储完毕后,回调里 可以 读取文件(当然你也可以 自己读取本地目录去查某文件是否解析完,但这里不讨论),回调里 按照路径,遍历的异步并发读取多个解压完的文件,
    这种情况 的 流量首先 已经减少了,但主要缺点就是 解压消耗和时间 消耗。
    主要集中在两点,一就是 加载·解压·同时存储在本地,这样 按照分析来说其实 是很耗时的,因为他把解压与写文件 合在了一起,写文件 按照测试来看,单独的写文件都是 很消耗性能的,然而,经测试,最多也就350ms ~ 500ms间 勉强也算 说得过去,而且 并不是 单独的 去运行它,而是 和其他逻辑 一起运行,可以同步的测一测,而且 ,读取配置 一般还没有 开始游戏,所以对性能要求不高,可以接受。然后就是 读取文件,这就蛋疼了,因为我没想过 解压后,存了再读,再用,我就想读了就用,省去存储,我想尽快进入游戏,等以后cpu空闲了,我再悄悄缓存起来~,这也就衍生了第三套方案,这里继续说本方案的用法。
    除了文件的解压,剩下的就是每个文件的读取了,经测试,勉强合格把,1个453k的文件 txt读取要55ms,测算下来100多文件全读取完,要1s 汗颜~有点慢~
所以就是 为了每人省1元每月,要不要等2s不到的时间。
本以为这是 不好的方案,因为写操作 和读操作 双倍耗了时间,然而,内置的解压和写操作,还是蛮不错的,而且,长远来看,毕竟是要缓存的,所以不如顺便好了。
3.  第三种 本以为 是比较 好的方案,因为,配置文件 不需要提前写入本地,然后再从本地读取,只需要解压到内存一下,然后马上就可以扔了,哪怕以后缓存起来,也不会消耗太多时间,马上就能加载游戏逻辑了。然而 我选用的是jszip库~
首先要接受的就是 库文件的引入,200kmin文件,这还好,毕竟 有5M的节省呢,最蛋疼的是,他的解压分两步,一个load一个file,就是说,装载整个zip文件只需要50ms,但是解压每个文件 巨耗时~ 因为wxfs.unzip 把解压集中在一起了,相当于 读取一个文件的耗时是 解压+读取 = 350~500 + 50ms ,而 jszip就呵呵~ 他读取同一个文件耗时为
50ms + 350ms,二者其实也不相伯仲,因为 毕竟一个操作内存,读取快但是操作的慢,一个读取rom,读取慢但是 操作快,半斤八两~
不过 几轮测试下来,加载平均耗时在60+,全部文件读取消耗了500-的平均时常。

所以 比较下来,的确是 第三点 比较符合我的需求,因为他比第一点节省了流量,同时将100ms左右的存储延迟 向后了,达到了可以快速反应的 效果,不过 反正都是要存的,有一个好处就是,可以这里去缓存,这样以后就没有 解压时延了。


不过,尝试了三种途径,总结下来,还是preload 加载好了,为了接洽 这两种方式,要改太多东西,贫僧 累了~
附赠两种 解压的测试代码
  1.    let a1 = egret.getTimer();
  2.         RES.getResByUrl("resource/assets/Config.zip", function(data){
  3.             let a2 = egret.getTimer();
  4.             JSZip.loadAsync(data).then((zipdata) => {
  5.                 let a3 = egret.getTimer();
  6.                 let aaa = 0;
  7.                 let bbb = 0;
  8.                 for(let a in zipdata.files){
  9.                     aaa++;
  10.                     zipdata.file(a).async('text').then(text => {
  11.                         bbb++;
  12.                         if(aaa == bbb){
  13.                             let a4 = egret.getTimer();
  14.                             console.log(a2-a1);
  15.                             console.log(a3-a2);
  16.                             console.log(a4-a3);
  17.                             console.log(111);
  18.                         }
  19.                     });
  20.                 }
  21.             });
  22.         },this, RES.ResourceItem.TYPE_BIN);
  23.         //________________
  24.         let m = wx.getFileSystemManager();
  25.         m.unzip({zipFilePath:"/resource/assets/Config.zip",targetPath:wx.env.USER_DATA_PATH + "/", success:(data,b)=>{
  26.                 let a2 = egret.getTimer();
  27.             
  28.                 console.log("a2 - a1   "+ (a2 - a1))

  29.                 m.stat({
  30.                     path:wx.env.USER_DATA_PATH + "/",
  31.                     recursive:true,
  32.                     success:(ss)=>{
  33.                         // console.log(ss)
  34.                         let a3 = egret.getTimer();
  35.                         let aa = 0;
  36.                         let bb = 0;
  37.                         for(let i = 0; i < ss.stats.length;i++){

  38.                             if(ss.stats[i].path.indexOf(".") > -1){
  39.                                 aa+=1;
  40.                                 m.readFile({
  41.                                     filePath:wx.env.USER_DATA_PATH + ss.stats[i].path,
  42.                                     encoding:"utf-8",
  43.                                     success:(s2)=>{
  44.                                         bb+=1;
  45.                                         // // console.log(s2)
  46.                                         // console.log(111);
  47.                                         if(aa == bb){
  48.                                             let a4 = egret.getTimer();
  49.                                             console.log("a4 - a3   "+(a4 - a3))
  50.                                             console.log(111);
  51.                                         }
  52.                                     }
  53.                                 })
  54.                             }
  55.                         }
  56.                     }
  57.                 })
  58.             },fail:(e)=>{
  59.                 console.log(e)
  60.             }
  61.         });
复制代码





分享到 :
1 人收藏

2 个回复

倒序浏览
app小王子  社区管理员 | 2020-4-3 10:17:37
优秀!
mlcbjm  登堂入室 | 2020-4-13 10:17:31
实践证明,虽然麻烦点,但是unzip还是快了很多,5M的配置文件,直接压成800k打在代码包中,解压从原来的5s也压缩到了1s不到~开心~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部