Egret社区
本帖最后由 mlcbjm 于 2020-4-2 17:49 编辑

默认的 缓存方式是,txt 是在xhr请求回来后write到本地,img/sound则是 使用wx.download。
通过 down的机制,他会get文件同时写入本地,再将本地缓存地址回复给调用者,调用者去load本地缓存。
开启缓存,wx.writeFile 会造成cpu的卡顿~ 具体原因~及情况未能追查~
只能尝试 绕路解决卡顿。
第一,txt文件的缓存 将“下载并返回给前端” 与 “缓存至本地” 这两个过程 分离开即可,我使用了延时60s再缓存。
同时 每200ms只缓存一个文件,就不会明显卡顿。
第二,我尝试将img/sound也这样子做~
然而 问题是,二者的 下载回调中,无法获得通用的数据,只能得到 img/sound的实例对象,
目前的情况是,
a. wx.request 去获取 img/sound的 arraybuffer数据,并缓存,然而 对应实例 无法通过arraybuffer 获得数据,至少我不会赋值
b.在 img.src=xxx的onLoad 回调中,我只能得到 [object htmlImage]这种对象,无法得到 正确的arraybuffer数据。
代码如下:

a.

  1. function download(url, target) {
  2.     return new Promise((resolve, reject) => {
  3.         wx.request({
  4.             url: url,
  5.             header:{"content-type":"image/*"},
  6.             responseType: "arraybuffer",
  7.             success: (v) => {
  8.                 setTimeout(()=>{
  9.                    const wxFs = wx.getFileSystemManager();
  10.                    wxFs.writeFileSync(wx.env.USER_DATA_PATH + "/test",v.data,"binary")
  11.                 },20000);
  12.                 resolve(???);//这里不会了
  13.             }
  14.         })
  15.     })
  16. }




  17. b.
  18. function loadImage(imageURL, scale9grid) {
  19.     return new Promise((resolve, reject) => {
  20.         const image = wx.createImage();
  21.         image.onload = () => {
  22.             const bitmapdata = new egret.BitmapData(image);
  23.             const texture = new egret.Texture();
  24.             texture._setBitmapData(bitmapdata);
  25.             if (scale9grid) {
  26.                 texture["scale9Grid"] = scale9grid;
  27.             }


  28.             //-这是原版的 load image,我不会在这里 将得到的数据 缓存下来~,并在下一次登陆时 复用,读取出来 使用???
  29.             setTimeout(() => {
  30.                 resolve(texture);
  31.             }, 0);
  32.         }
  33.         image.src = imageURL;
  34.     })
  35. }
复制代码





分享到 :
2 人收藏

4 个回复

倒序浏览
mlcbjm  登堂入室 | 2020-3-25 15:40:15
egret.BitmapData.create("arraybuffer",res.data,(b)=>{

这样即可~

总结来说就是 request 得来的 arraybuffer 数据 通过 bitmapdata 自动转化为了 egret 识得的 格式~

点评

[b赞赞赞]  发表于 2020-3-26 15:28
mlcbjm  登堂入室 | 2020-3-27 09:27:09
这其实 只是 第一步,
2. 缓存策略 还需要 定制,因为是 120M+的远程资源,而且具体情况 分析来,120M分为 静态的 与动态的,但又因为 资源数目过多,分布散,所以 最好 有个 动态 维护缓存文件的 接口,管理needcash
3. 现在我的想法,只是将 缓存 定时 后延,也就是 请求的回调里,settimeout一下,这样 还会衍生两个问题,
一是 对于大文件,占用i/o时 会卡住cpu;另一个就是 因为 大量文件 settimeout ,内存占用 会很高,这是副作用,
为了解决 内存占用 和大文件 卡住cpu,还需要 另想办法~
mlcbjm  登堂入室 | 2020-3-27 16:46:01
突然的 反省
我一直以为 是,wx的 i/o 操作 卡住了cpu,所以 要想 让cpu 不卡,需要 等cpu空闲 了再 缓存,所以 我
用setTimeout ,后延了 60s等游戏稳定了 再去缓存, 所以 又衍生了,内存压力大的 后遗症。

。。。然而 突然想到,虽然 i/o的确会 占用一部分cpu但是 wx是有 限制的,并发数才10,所以,
之所以 在缓存资源时,游戏逻辑卡顿,并不是 cpu被卡住了, 而是 逻辑 里面 有函数 在等待 缓存的回调,从而导致 卡顿,所以 直接 setTimeout 0s即可,虽然 会比 60s还是 卡一点,但是 并不严重,相比一直的 内存占有,还是 在加载资源时就 完事吧~别占用 更多资源了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

返回顶部