wxDownloader.cleanOldCaches()导致资源丢失的问题

升级2.1.3引擎,
同时调整了一下wxDownloader.cleanOldCaches()的调用时机(太早会导致不必要的下载)
更上微信小游戏测试发现:部分资源图显示空白,但没报错

看了下builtin/weapp-adapter,
发现wx-downloader可能存在一些问题。

先大概了解一下接口执行逻辑:
1、枚举出缓存目录下的所有文件
2、然后以‘已下载(cc.loader.load / cc.load.loadRes,及depends)且已缓存到内存中的文件列表’作为过滤器,将不在列表里的磁盘缓存目录下的其他文件删除。

其中枚举、删除动作均为异步接口,
在枚举出来得到的’删除列表’,到真正执行删除的过程中,有可能新增下载请求,而这个url也有可能刚好已在缓存目录下,而这时已被添加到’删除列表’中,
所以导致内存记录的状态为已下载完成,而其实这个文件并不存在于目录下(已被删除),而且也不会再次触发重新下载。

不知道以上理解是否有问题,麻烦引擎大佬们确认下是否有bug?

自顶:3:

[quote=“zzzz.leung, post:1, topic:84352”]
到真正执行删除的过程中,有可能新增下载请求,而这个url也有可能刚好已在缓存目录下,而这时已被添加到’删除列表’中,
[/quote] 感谢你的反馈,我看了下不太可能出现这个情况,因为一旦执行了这行之后,新来的请求都会去重新下载这个资源到临时目录,不会用缓存目录中的资源,删不删除缓存至少都不会影响渲染;而且如果是被错误删除了,肯定是会报
错的,不会显示空白


这里为什么会导致这种情况目前还找不到原因,不确定是不是缓存的问题,建议你不要把cleanOldCaches和加载资源放在同一时间调用,你在加载间隔期使用,在观察下是否复现

这个为什么要用缓存到内存中的文件列表’作为过滤器?
settings文件里不是有所有要用的文件嘛,为啥不以这里面的文件作为过滤器,简单高效

cachedFiles是已下载完成的列表。

url1请求下载
1、readFromLocal ->
2、wxFsUtils.exists (异步)->
3、seek ->
4、downloadRemoteFile ->
5、写入cacheQueue

如果在第2步的时候,cleanOldCaches刚好跑到wxFsUtils.readDir(self.cacheDir, function (err, list) {
是否有可能会将url1写入到toDelete?

有非常小的可能会写入到toDelete,但是即使写入toDelete也没有影响,因为当你走到exists这个分支的时候

,后续是不会使用缓存资源的,而是去下载远程资源来使用,在这种情况下,即使缓存里的资源被删除了,跟使用也没什么关系,不会造成渲染错误的问题呀

好的,谢谢。

我再详细定位下看下。。。
结果后续跟帖更新。

非常感谢你的反馈,微信的文件系统在同时写文件时是很可能造成死锁的,所以基于这种考虑,wxDownloader在写文件的时候都是定时写文件,而不用同步接口,避免同步和异步接口同时写入造成死锁,但是定时写文件所带来的延迟可能又导致其他时序上的问题,所以建议尽量不要在加载资源的过程中,去清理缓存,这是比较容易出问题的阶段

我现在逻辑,每启动6次,异步获取一下gameCaches的size,并缓存,下次启动时直接读取缓存的值,如果大于指定M数,就调用cleanOldCaches,但是可能出现进步了游戏的情况(不必现)。【注:获取gameCaches的size和调用cleanOldCaches不会在同一次启动中触发】

我能确定是调用cleanOldCaches之后导致的问题,现在想问下,cleanOldCaches接口什么时机调用合适,或者调用需要什么注意事项?

这么说,我遇到的情况可能就是这种情况了,我在启动的时候处理的。