动态合图

    降低 DrawCall 是提升游戏渲染效率一个非常直接有效的办法,而两个 DrawCall 是否可以合并为一个 DrawCall 的其中一个重要因素就是这两个 DrawCall 是否使用了同一张贴图。

    Cocos Creator 提供了在项目构建时的静态合图方法—— 自动合图(Auto Atlas)。但是当项目日益壮大的时候贴图会变得非常多,很难将贴图打包到一张大贴图中,这时静态合图就比较难以满足降低 DrawCall 的需求。所以 Cocos Creator 在 v2.0 中加入了 动态合图(Dynamic Atlas)的功能,它能在项目运行时动态的将贴图合并到一张大贴图中。当渲染一张贴图的时候,动态合图系统会自动检测这张贴图是否已经被合并到了图集(图片集合)中,如果没有,并且此贴图又符合动态合图的条件,就会将此贴图合并到图集中。

    动态合图是按照 渲染顺序 来选取要将哪些贴图合并到一张大图中的,这样就能确保相邻的 DrawCall 能合并为一个 DrawCall(又称“合批”)。

    若希望强制开启动态合图,请在代码中加入:

    注意这些代码请写在项目脚本中的最外层,不要写在 / 等类函数中,才能确保在项目加载过程中即时生效。否则如果在部分贴图缓存已经释放的情况下才启用动态图集,可能会导致报错。

    若希望强制禁用动态合图,可以直接剔除“Dynamic Atlas”模块以减小引擎包体,或者通过代码控制:

    详情可参考 API 文档 DynamicAtlasManager

    目前动态合图系统只支持 Sprite、Label 等部分内建渲染组件的合图。如果希望加入其它类型渲染组件的支持,可以自己定制渲染组件。需要将相应的 SpriteFrame 添加到动态合图系统中:

    当 SpriteFrame 被添加到动态合图后,SpriteFrame 的贴图被替换为 ,SpriteFrame 中的 uv 也会按照大图中的坐标进行重新计算。

    如果希望看到动态合图的效果,那么可以开启调试来看到最终生成的大图,这些大图会添加到一个 ScrollView 展示出来。