使用记录33_自动释放资源和延迟加载

转载自 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级菜单只显示对应关卡的按钮。

猜你喜欢

转载自blog.csdn.net/cui6864520fei000/article/details/89215338