如果项目中的场景很多,随着新场景的切换,内存占用就会不断上升。有以下几种方法可以尝试。
一、使用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 手册 - 资源释放