删了缓存就好了
这个报错,九成九是场景上使用到已被释放的资源对象导致的,建议排查一下资源。
![]()
有不少这样现象,要查释放逻辑或做保护了
是这样子的,资源释放没处理好就会出现这种情况
好的谢谢,我看看!奇怪的是不是固定出现。这就有点难弄

我之前是直接改源码,在Sprite组件里头调用updateUVs的地方加个try-catch,然后打印当前使用的spriteFrame名称以及当前所在node在场景上的路径。这样触发报错的时候可以知道是哪个节点出问题,以及出问题的资源是哪个。
看你这边的堆栈应该是个自定义的组件,可以也在对应的位置加上try-catch试试。
比如:
一个节点的Sprite组件设置了某个SpriteFrame,然后某些操作导致这个SpriteFrame被释放了,释放之后这个节点的又设置active=true激活了,就会出现这个报错
释放资源前,如果不确定的话,可以检查以下该资源有无正在被当前节点树的节点所引用;还有当前已缓存的sceneAsset、Prefab,如果也引用到了该资源,最好将SceneAsset和Prefab一起释放
最好的做法我觉得是严格管理资源,不要到处互相引用
是个好主意,就是我不太会改源码!不知道那个updateUVs在哪里
![]()
这个看着是你们项目自己的代码吧?cocos的源码里貌似没有这个,找到这个脚本,然后直接搜索updateUVs这个字符串就可以找到对应的位置了。
如果找不到这个脚本,可以越过这个去 cocos 源码的 sprite.ts 脚本里面搜索updateUVs。
cocos源码位置(直接在 cocos dashboard 的安装列表中找到对应版本打开):
sprite.ts 脚本位置:resources\resources\3d\engine\cocos\2d\components\sprite.ts
修改cocos源码之后,需要回到项目里,重新编译引擎代码,如果是首次编译会久一点,编译完不需要重启cocos,直接运行项目就可以了。

这题我会,直接进入报错的接口函数,添加测试模式情况下触发,打印被释放的UUID或者name.就可以精准定位哪个资源被释放 
嗯呢,找到了,我加个debugger 等再出现就知道啥情况了!

