转载自 https://blog.csdn.net/haibo19981/article/details/81251871
1.前言
https://blog.csdn.net/liujia216/article/details/53215751
1.1.自动释放资源 - 资源自动释放策略
如果项目中的场景很多,随着新场景的切换,内存占用就会不断上升,很吃内存。
除了使用 cc.loader.release等API来精确释放不使用的资源,我们还可以使
用场景的自动释放功能。要配置自动释放,可以在 资源管理器 中选中所需场景,
然后在属性检查器 中设置“自动释放资源”选项,该项功能是默认关闭的。
从当前场景切换到下一个场景时,如果当前场景不自动释放资源,则该场景中直
接或间接引用到的所有资源(脚本动态加载的不算),默认都不主动释放。反之
如果启用了自动释放,则这些引用到的资源默认都会自动释放。
防止特定资源被自动释放
启用了某个场景的资源自动释放后,如果在脚本中保存了该场景的资源启用,当
场景切换后,这些资源就会变成非法的,很容易出错的。或者如果调用
cc.game.addPersistRootNode 方法让某个该场景中的节点保留到了下一个场景,
但这个节点及其子节点用到的所有资源也还是会被同时释放,导致下个场景不能
再正确访问这些资源。为了让这部分资源在场景切换时不被释放,我们可以使用
cc.loader.setAutoRelease 或者 cc.loader.setAutoReleaseRecursively 来保
留这些资源。
1.2.延迟加载资源 - 场景加载策略
在 资源管理器 中,选中指定场景,可以在 属性检查器 中看到“延迟加载资源”
选项,该项默认关闭。
不延迟加载资源
加载场景时,如果这个选项关闭,则这个场景直接或间接递归依赖的所有资源都
将被加载,全部加载完成后才会触发场景切换。
延迟加载资源
加载场景时,如果选项开启,则这个场景直接或间接依赖的所有贴图、粒子和声音
都将被延迟到场景切换后才加载,使场景切换速度极大提升。
同时,玩家进入场景后可能会看到一些资源陆续显示出来,并且激活新界面时也可
能会看到界面中的元素陆续显示出来,因此这种加载方式更适合网页游戏。
使用这种加载方式后,为了能在场景中更快地显示需要的资源,建议一开始就让场
景中暂时不需要显示的渲染组件(如 Sprite)保持非激活状态。
注意,Spine和TieldMap依赖的资源永远都不会被延迟加载。
2.实际使用时的经验
2.1.若场景中有其他场景共用的资源,则不要勾选自动释放。实际上,小游戏的
场景几乎不可能全使用自己的资源。
2.2.若游戏中的关卡少于50关,则可以使用引用将所有关卡的预制文件添加到游戏
场景中,在进入游戏场景之前,会加载所有引用的关卡预制文件,这里可以将所有
关卡预制文件勾选延迟加载。
当关卡多于50关时,即使延迟加载了关卡预制文件,进入游戏界面也会有明显的卡
顿,这时推荐使用动态加载关卡预制文件。
另外,关卡界面,若是用滚动区同时显示了超过100个关卡按钮,反复从其他界面进入
关卡界面多次,有可能会挤爆内存,结果小游戏会黑屏。解决方法就是不使用滚动
区,而使用翻页。或使用2级菜单,在1级菜单界面提供给玩家选择关卡范围的按钮,
在2级菜单只显示对应关卡的按钮。