Cocos-场景资源释放检查

如果项目中的场景很多,随着新场景的切换,内存占用就会不断上升。有以下几种方法可以尝试。

一、使用API释放资源

        a、Asset Manager 中提供了资源释放模块,用于管理资源的释放。

        如使用assetManager.releaseAsset等API来精准释放资源。

        b、 Asset 实例都拥有成员函数 Asset.addRef 和 Asset.decRef,分别用于增加和减少引用计数。一旦引用计数为零,Creator 会对资源进行自动释放    

         当需要使用资源时,调用 addRef 增加其引用

        Creator 会在调用 decRef 后尝试对其进行自动释放    

二、场景的自动释放功能

        通过勾选Auto Release Asset来释放场景资源。

        勾选后,点击右上方的 应用 按钮,之后在切换该场景时便会自动释放该场景所有的依赖资源。

        建议场景尽量都勾选自动释放选项,以确保内存占用较低,除了部分高频使用的场景

三、释放检查

为了避免错误释放正在使用的资源造成渲染或其他问题,Creator 会在自动释放资源之前进行一系列的检查,只有检查通过了,才会进行自动释放。

        a、资源的引用计数为 0,直接摧毁该资源,移除缓存。

        b、资源一旦被移除,会同步触发其依赖资源的释放检查,将移除缓存后的资源的 直接 依赖资源(不包含后代)的引用都减 1,并同步触发释放检查。

        c、如果资源的引用计数不为 0,即存在其他地方引用到该资源,此时需要进行循环引用检查,避免出现自己的后代引用自己的情况。如果循环引用检查完成之后引用计数仍不为 0,则终止释放,否则直接摧毁该资源,移除缓存,并触发其依赖资源的释放检查(同步骤 2)。

四、资源的静态引用

编辑资源时(例如场景、预制件、材质等),引擎可以通过这些数据分析出依赖资源列表,这样的引用关系就是静态引用】

        a、在使用 assetManager 或者 Asset Bundle 加载某个资源时,引擎会在底层加载管线中记录该资源所有 直接依赖资源 的信息,并将所有 直接依赖资源 的引用计数加 1,然后将该资源的引用计数初始化为 0。

        b、在释放资源时,取得该资源之前记录的所有 直接依赖资源 信息,并将所有依赖资源的引用计数减 1。

五、资源的动态引用

        通过代码动态加载资源并设置到场景的组件上,则资源的引用关系不会记录在序列化数据中,要长期保存、使用,手动增加引用计数,在不需要时,decRef 移除引用计数,并将资源引用设为 null

具体参考学习网址:Cocos Creator 3.8 手册 - 资源释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值