关于cc.assetManager.cacheManager的疑惑

疑惑1: cc.assetManager.cacheManager.deleteInterval的单位是秒还是毫秒?或者是其它单位?
疑惑2 :cc.assetManager.cacheManager.clearCache只是把json文件中的信息给清空了,并没有真实的删除资源文件,为什么?
疑惑3: 当我调用一次cc.assetManager.cacheManager.clearLRU之后就一直报错,为什么?这种清理缓存的方式要如何使用?我尝试过调用cc.assetManager.cacheManager.clearLRU之后立即调用cc.game.restart,发现并没有清理掉之前loadRemote的资源.cacheList.json文件中的信息也没有清理.

@EndEvil @jare @jjyinkailejj

顶····
@EndEvil

呃···还没有关注到啊···
@jare

抱歉,注释里没加单位,这个是毫秒为单位

整个缓存目录的文件夹都被删了呀

报什么错啊? clearLRU 是异步的操作,并不是同步的。会慢慢删除缓存



模拟器上的报错信息是这样的···

手机上的报错是这样的:

@EndEvil

用这个pr应该可以修复,https://github.com/cocos-creator-packages/jsb-adapter/pull/314/files

1赞

按照这个pr是不会报错了,但是我发现这也实现不了清除操作···我设置deleteInterval为10秒,然后调用clearLRU之后等了很久,gamecaches下的文件也没有删除。
这是我写的一个demo----烦请排查一下···demo.zip (291.2 KB)

@EndEvil

这是缓存里面资源数量太少了,clearLRU 会清除当前缓存数量的 3 分之 1。资源数量太少的情况下,就不清除了

关于缓存这块我还是有一个疑问,远程资源加载和远程Bundle加载,都会缓存到gamecaches下,如果按照LRU的方式去清理就会按时间清理。

会有一种场景就是我缓存的Bundle不清理,只是清理一些远程资源(Bundle的资源先于远程资源缓存),这种时候是不是就不能用这个去管理了?

比如说,一个游戏会缓存玩家头像,如果我需要清理缓存的头像是不是就得把头像的缓存自己去实现?比如把文件下载后拷贝到其它目录,然后把gamecaches下的资源删除?

其实我建议引擎可以把Bundle的缓存和单纯的网络资源缓存分开管理···

@EndEvil @jare

这种情况就用 removeCache 呗

借楼。预制了一个 prefab,内部包含一些 sprite。用 cc.resources.load 加载,输出刚加载后 prefab 的引用计数。

在 Chrome 中预览,输出的是 0。构建为 web 之后,输出的是大于 0 的值,不同的 prefab 输出的值不同。为什么会不一样?如果有值是正确的,那刚刚加载后就不是0,还怎么根据引用计数来做释放?

应该为 0 才对,有demo么?

2.4.1 新建的一个 ts 版 hello world,把 cocos 拖成 prefab,Texture 文件夹加个自动图集,就可以重现。

Demo:checkRef.zip (1.2 MB)

代码:

cc.resources.load("cocos", function (error, fab) {
            if (fab instanceof cc.Prefab) {
                cc.warn("prefab ref count: " + fab.refCount)
                cc.find("Canvas").addChild(cc.instantiate(fab))
            }
        })

额,这个算是个bug。虽然不影响加载,也不影响释放,原因是 prefab 这个资源比较特别,会自己引用自己,导致引用计数多了。我们看下怎么处理自己引用自己的情况吧。不过,即使这样,释放也是能正常释放的,因为释放的时候会判断循环引用的情况,所以自己引用自己也能正常释放。

1赞