CocosCreator学习笔记之各种小优化(菜鸟自用)

注:拷贝自官方文档

修改场景资源自动释放策略

如果项目中的场景很多,随着新场景的切换,内存占用就会不断上升。除了使用 cc.loader.release 等 API 来精确释放不使用的资源,我们还可以使用场景的自动释放功能。要配置自动释放,可以在 资源管理器 中选中所需场景,然后在 属性检查器 中设置“自动释放资源”选项,该项默认关闭。

从当前场景切换到下一个场景时,如果当前场景不自动释放资源,则该场景中直接或间接引用到的所有资源(脚本动态加载的不算),默认都不主动释放。反之如果启用了自动释放,则这些引用到的资源默认都会自动释放。

已知问题:粒子系统的 plist 所引用的贴图不会被自动释放。如果要自动释放粒子贴图,请从 plist 中移除贴图信息,改用粒子组件的 Texture 属性来指定贴图。

防止特定资源被自动释放

启用了某个场景的资源自动释放后,如果在脚本中保存了对该场景的资源的“特殊引用”,则当场景切换后,由于资源已经被释放,这些引用可能会变成非法的,有可能引起渲染异常等问题。为了让这部分资源在场景切换时不被释放,我们可以使用 cc.loader.setAutoRelease 或者 cc.loader.setAutoReleaseRecursively 来保留这些资源。

“特殊引用”指的是以全局变量、单例、闭包、“特殊组件”、“动态资源”等形式进行的引用。“特殊组件”是指通过 cc.game.addPersistRootNode 方法设置的常驻节点及其子节点上的组件,并且这些组件中包含以字符串 URL 或 UUID,或者以除了数组和字典外的其它容器去保存的资源引用。“动态资源”指的是在脚本中动态创建或动态修改的资源。这些资源如果还引用到场景中的其它资源,则就算动态资源本身不应该释放,其它资源默认还是会被场景自动释放。

以上关于场景资源自动释放部分的内容可以归纳为下图中的几种情况:
CocosCreator学习笔记之各种小优化(菜鸟自用)_第1张图片

资源的放置?

如果一份资源仅仅是被 resources 中的其它资源所依赖,而不需要直接被 cc.loader.loadRes 调用,那么 请不要 放在 resources 文件夹里。否则会增大包体和 settings.js 的大小,并且项目中无用的资源,将无法在构建的过程中自动剔除。同时在构建过程中,JSON 的自动合并策略也将受到影响,无法尽可能将零碎的 JSON 合并起来。

修改场景加载策略

在 资源管理器 中,选中指定场景,可以在 属性检查器 中看到“延迟加载资源”选项,该项默认关闭。

不延迟加载资源
加载场景时,如果这个选项关闭,则这个场景直接或间接递归依赖的所有资源都将被加载,全部加载完成后才会触发场景切换。

延迟加载依赖的资源
加载场景时,如果选项开启,则这个场景直接或间接依赖的所有贴图、粒子和声音都将被延迟到场景切换后才加载,使场景切换速度极大提升
同时,玩家进入场景后可能会看到一些资源陆续显示出来,并且激活新界面时也可能会看到界面中的元素陆续显示出来,因此这种加载方式更适合网页游戏
使用这种加载方式后,为了能在场景中更快地显示需要的资源,建议一开始就让场景中暂时不需要显示的渲染组件(如 Sprite)保持非激活状态。

SpineTiledMap 依赖的资源永远都不会被延迟加载。*

使用图集(Atlas)资源

在游戏中使用多张图片合成的图集作为美术资源,有以下优势:

合成图集时会去除每张图片周围的空白区域,加上可以在整体上实施各种优化算法,合成图集后可以大大减少游戏包体和内存占用
多个 Sprite 如果渲染的是来自同一张图集的图片时,这些 Sprite 可以使用同一个渲染批次来处理,大大减少 CPU 的运算时间,提高运行效率。

碎图转图集
在项目原型阶段或生产初期,美术资源的内容和结构变化都会比较频繁,我们通常会直接使用碎图(也就是多个单独的图片)来搭建场景和制作 UI。在之后为了优化性能和节约包体,需要将碎图合并成图集。Creator 提供了自动图集功能,可以在发布项目时无缝地将生产阶段的碎图合并成图集,并且自动更新资源索引。

位图字体合并渲染

如果位图字体使用的贴图和其他 Sprite 使用的贴图是同一张,而且位图字体和 Sprite 之间没有插入使用其他贴图的渲染对象时,位图字体就可以和 Sprite 合并渲染批次。在放置位图字体资源时,请把 .fnt 文件、.png 文件和 Sprite 所使用的贴图文件放在一个文件夹下,然后参考 自动图集工作流程 将位图字体的贴图和 Sprite 使用的贴图打包成一个图集,即可在原生和 WebGL 渲染环境下自动享受位图字体合并渲染的性能提升。

详情请参考 BMFont 与 UI 合图自动批处理。

运行时每帧更新对齐和优化策略

Widget 组件一般用于场景在目标设备上初始化时定位每个元素的位置,但一旦场景初始化完毕,很多时候我们就不需要 Widget 组件再进行对齐了。这里有个重要的属性 alignOnce 用于确保 Widget 组件只在初始化时执行对齐定位的逻辑,在运行时不再消耗时间来进行对齐。

alignOnce 如果被选中,在组件初始化时执行过一次对齐定位后,就会通过将 Widget 组件的 enabled 属性设为 false 来关闭之后每帧自动更新来避免重复定位。如果需要在运行时实时定位,你需要手动将 alignOnce 属性关闭(置为 false),或者在运行时需要进行每帧更新对齐时手动遍历需要对齐的 Widget 并将他们的 enabled 属性设为 true。

对于有很多 UI 元素的场景,确保 Widget 组件的 alignOnce 选项打开,可以大幅提高场景运行性能。

你可能感兴趣的:(cocos,creator)