编辑器预览的bug,为什么编辑器预览使用的WeakCache,导致获取资源的时候报错

shared.ts下面,
export const assets = EDITOR ? new WeakCache() : new Cache();
编辑器预览使用WeakCache,其他环境使用Cache,图片都引用都被回收了(WeakRef),导致获取资源报错,不知道是不是切场景的时候被回收的

网页是好的

  • Creator 版本: 3.8.5

  • 目标平台: 编辑器预览

这2个帖子也有一样的问题:


@Knox,大佬能帮忙看看吗

麻烦给一个可以复现的 demo 吧,这样比较好准确的快速排查到问题

很奇怪,我写个demo,但是又复现不了,2个项目又都是这个情况 :rofl:
这个WeakCache和Cache到底有什么区别呢?为什么编辑器模式要用WeakCache

NewProject386.zip (228.6 KB)

具体的代码就是这样(但是没复现,难道是demo资源太简单了不能触发v8的机制?),先在LoadScene里面动态加载资源resources.load,然后切换场景到TestScene,然后在resources.get,真实项目的逻辑就是这样的,而且我发现WeakCache释放资源的时机也不是完全相同

我感觉如果是编辑器预览话,是不是应该和游戏保持一致?用new Cache(),而不是WeakCache()

3.6 | 编辑器预览(GameView)公测帖 在3.6的时候我都说过这个问题了。修是不可能修的。

他们用weakcache就是有概率导致ref存在但是deref为空。而且mdn都说了,能不用就不用。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakRef。

备注: 在使用前请阅读尽量避免使用,对于 WeakRef 对象的使用要慎重考虑, 能不使用就尽量不要使用

PS: 官方为什么坚持使用呢?我怀疑是多次编辑器启动可能存在较为棘手的资源内存泄露或者别的什么泄露。所以用weakref来暴力的规避这个问题。

大佬,那你怎么处理的?发现资源不在了,就在加载一下吗?

我没处理,我也不会为了在in editor preview中这点功能,再加上这种狮山代码。他这个都是概率复现。非必现bug

我这边是必现的,而且编辑器调试比较方便,可以随时改节点,上面的链接失效了,我贴个新的:WeakRef - JavaScript | MDN

你帖子不是说非必现吗 编辑器预览的bug,为什么编辑器预览使用的WeakCache,导致获取资源的时候报错 换句话说,如果是必现bug。那就很好查了

现在的项目是必先的,我是3.8.6,所以必须解决了

必现好查,追踪一下

我在weak-cache.ts下面的remove,clear,destroy都打了条件断点,没发现断住,WeakRef就自己消失了,不太好查哎。是项目必现。
搞成demo又不出现了,也许项目资源多,好出现

我存了个引用,把这个问题处理了