分享一个极简的资源释放解决方案

资源释放会造成卡顿吗

建议在切换场景的时候调用,因为性能损耗直接跟节点数量成正比

这个方式 没有用到引用计数? 或者说不关心引用计数了? 靠的是 不是使用中的资源 就会被清理掉? 因为引擎告诉你已经加载了的资源 你排除掉正在使用的资源 那么剩下就是应该被清除掉的了?

:joy:

最初发的版本是用于Creator 3D的,现在的3.3资源管理模块已经跟2.4接近。略作修改应该就可以了

可以先不用管COCOS哪个版本的,就从机理上来说 从规则上来说,这个机制是不用管引用计数的 是从资源的是否被场景引用到 做判断,来进行释放? 也就是我上面说的情况

你说的在旧版本是适用的,新版本的资源管理自带了引用计数。

楼主试试把googl浏览器的cpu效率降低6倍,资源加载也降低速度,然后让2个scene引用用一个资源,然后切换scene,看有没有问题呢?

之前2.2版本的已经上线微信小游戏了,3.3的还没测试

有些动态加载的资源 比如声音,比如某些配置文件 ,不会挂在场景中的 那么释放的时候 ,那么这种找到非挂接到场景中就会被销毁的方式,是否有问题会?

会有问题。我缓存池里的prefab虽然有指针引用,但是prefab上的所有材质和贴图都没了。所以使用该方案需谨慎。

你的这个prefab 是没有加入场景中? 然后又运行了清理功能,然后就出现相关资源被清除的问题了?

需要在组件脚本里有引用,否则统计不到。注意事项里有说明。

现在呢 纯是讨论性质的啦,那么现在如果做个反向思维操作呢 比如你加载了一个prefab,你加到场景中某个节点下了 然后你又释放了,然后你做的清理工作调整一下 改成你知道这个prefab 也就是说你知道你要释放哪个资源, 然后也知道这个资源所有涉及到的子资源 子子资源 等一个相关资源的集合 ,然后检查这个资源集合里的每一项 是否在挂在场景中,没有的话就删除,有就保留? 这样 是不是就不存在误删除的可能了?

没看懂····

这个方案的本质就是扫描整个场景上所有节点的所有component组件引用的所有资源。然后遍历缓存看哪些有没有用到,没用到就清理掉

不扫描整个系统了, 改成你要删除哪个资源 就针对这个资源涉及到的相关资源列表 做一次遍历,有被引用的 就留着 ,没被用到的就删除,这个思路是否可行?

不扫描整个系统的话,就没办法判断这个资源是否被用到呀。例如,你要删这个预制体,但这个预制体里用的一个图片其他地方用到了,那么这个图片就不能删掉。如果不扫描整个场景你就不知道一个资源是否被用到了。

对,好像有些问题 我再想想

mark!!