CocosCreator中如何优化DrawCall以提升性能?

更新于
2026-09-26 12:45:06
1阅读来源:SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1673个文字,预计阅读时间需要7分钟。

CocosCreator中如何优化DrawCall以提升性能?

目录+前言+什么是DrawCall+DrawCall是如何影响性能的呢?+如何减少DrawCall针对图片资源+针对Label必须之路——调整UI层级+总结+前言+在游戏开发中,DrawCall作为一个非常重要的性能指标,不容忽视+

目录
  • 前言
  • 什么是 DrawCall
  • DrawCall 是如何影响性能的呢?
  • 如何减少 DrawCall
    • 针对图片资源
    • 针对 Label
    • 必经之路–调整UI层级顺序
  • 总结

    前言

    在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现。
    无论是 Cocos Creator、Unity、Unreal 还是其他游戏引擎,只要说到游戏性能优化,DrawCall 都是绝对少不了的一项。
    本文将会介绍什么是 DrawCall,为什么要减少 DrawCall 以及在 Cocos Creator 项目中如何减少 DrawCall 来提升游戏性能。

    什么是 DrawCall

    DrawCall就是CPU调用图形库(比如DirectX或OpenGL)的图形绘制接口,来命令GPU进行渲染的操作。

    DrawCall 是如何影响性能的呢?

    先举个栗子:
    docs.cocos.com/creator/manual/zh/advanced-topics/dynamic-atlas.html

    CocosCreator中如何优化DrawCall以提升性能?

    动态图集有2个限制:

    • 动态图集尺寸最大是 2048 * 2048
    • 碎图的尺寸默认不能超过 512,可通过 API 进行修改:cc.dynamicAtlasManager.maxFrameSize = 512

    tips: 启用动态合图会增大内存消耗,不同平台占用内存不一致。小游戏和原生平台默认禁止动态合图。可以通过 api 自行开启:cc.macro.CLEANUP_IMAGE_CACHE = false; cc.dynamicAtlasManager.enabled = true;
    还需要保证纹理的 Premulyiply Alpha(预乘)、Wrap Mode(循环模式) 和 Filter Mode(过滤模式) 等信息与动态图集一致才能够动态合批。

    另外,静态图集也能参与动态合图,只要满足动态合图的要求即可。
    tip1: 自动图集资源(Auto Atlas)需要在其属性检查器面板中开启 Texture 栏下的 Packable 选项,该选项默认是禁用的。
    tip2: 精灵(Sprite)也是需要开启 Packable 选项才能动态合图。该选项默认是开启的。
    tip3: 如果要使用了 shader ,那么需要禁用该精灵的 Packable 选项。

    针对 Label

    位图字体(BMFont)

    在 Creator 中使用系统字体或 TTF 字体的 Label 会打断渲染合批,特别是 Label 和 Sprite 层叠交错的情况,每一个 Label 都会打断合批增加一个 DrawCall。

    因此建议使用 BMFont 来代替 TTF 或系统字体,并且将 BMFont 与 UI 碎图打包到同一图集中(或「开启动态合图」),可以免除大部分文本导致的 DrawCall增加。

    文本缓存模式(Cache Mode)

    Creator 2.0.9 版本在 Label 组件上增加了 Cache Mode 选项,来解决系统字体和 TTF 字体带来的性能问题。
    CacheMode有三种选项:

    • NONE(默认) 每一个 Label 都会生成为一张单独的位图,且不会参与动态合图,所以每一个 Label 都会打断渲染合批
    • BITMAP 开启 BITMAP 模式后,文本同样会生成为一张位图,但是只要符合动态合图要求就可以参与动态合图,和周围的精灵合并 DrawCall 。一定要注意 BITMAP 模式只适用于不频繁更改的文本,否则内存会爆炸。
    • CHAR 开启 CHAR 模式后,引擎会将该 Label 中出现的所有字符缓存到一张全局共享的位图中,相当于是生成了一个 BMFont 。适用于文本频繁更改的情况,对性能和内存最友好。tip: 该模式 只能用于字体样式和字号固定,并且不会频繁出现巨量未使用过的字符 的 Label。因为共享位图的最大尺寸为 2048*2048,占满了之后就没办法再渲染新的字符,需要切换场景才会清除共享位图。

    总结:对于大量频繁更改的文本,使用 CHAR 模式带来的性能提升是非常明显的。
    同时 CHAR 模式的局限也很明显,一般用于场景中出现大量数字文本,类似于经验值增加、血量减少之类的特效的情况

    必经之路–调整UI层级顺序

    原则:

    分离图像节点和文本节点文本使用 BMFont 或 Cache Mode 选项,尽量出现避免文本打断渲染合批的情况FBI WARNING: 一个 Mask 组件及其控制的渲染节点,需要至少三次 Draw call。第一次开启模板测试并调用一次 Draw call,刷新模板缓冲。第二次绘制对需要通过模板测试的区域进行设置。第三次再进行实际的子节点内容绘制,绘制结束再关闭模板测试。因此 使用 Mask 组件就无法与其他相邻节点进行批次处理 ,但是 Mask 组件内部的连续节点在满足合并规则的情况下还是会进行合批。

    总结

    改变渲染状态会打断渲染合批,例如改变纹理状态(预乘、循环模式和过滤模式)或改变 Material(材质)、Blend(混合模式)等等,所以使用自定义 Shader 也会打断合批。图集默认不参与动态合图,手动开启自动图集资源的 Packable 选项后如果最终图集符合动态合图要求也可以参与动态合图。纹理开启 Packable 选项参与动态合图后无法使用自定义 Shader,因为动态合图会修改原始贴图的 UV 坐标。使用 Cache Mode 的 BITMAP 模式需要注意内存情况,CHAR 模式需要注意文本内容不宜过多。在 ***Cocos Creator 2.0.7 之前的版本***中,改变节点的颜色或透明度、Sprite 组件使用九宫格(Sliced)都会打断渲染合批

    以上就是详解CocosCreator优化之DrawCall的详细内容,更多关于CocosCreator优化DrawCall的资料请关注自由互联其它相关文章!

    本文共计1673个文字,预计阅读时间需要7分钟。

    CocosCreator中如何优化DrawCall以提升性能?

    目录+前言+什么是DrawCall+DrawCall是如何影响性能的呢?+如何减少DrawCall针对图片资源+针对Label必须之路——调整UI层级+总结+前言+在游戏开发中,DrawCall作为一个非常重要的性能指标,不容忽视+

    目录
    • 前言
    • 什么是 DrawCall
    • DrawCall 是如何影响性能的呢?
    • 如何减少 DrawCall
      • 针对图片资源
      • 针对 Label
      • 必经之路–调整UI层级顺序
    • 总结

      前言

      在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现。
      无论是 Cocos Creator、Unity、Unreal 还是其他游戏引擎,只要说到游戏性能优化,DrawCall 都是绝对少不了的一项。
      本文将会介绍什么是 DrawCall,为什么要减少 DrawCall 以及在 Cocos Creator 项目中如何减少 DrawCall 来提升游戏性能。

      什么是 DrawCall

      DrawCall就是CPU调用图形库(比如DirectX或OpenGL)的图形绘制接口,来命令GPU进行渲染的操作。

      DrawCall 是如何影响性能的呢?

      先举个栗子:
      docs.cocos.com/creator/manual/zh/advanced-topics/dynamic-atlas.html

      CocosCreator中如何优化DrawCall以提升性能?

      动态图集有2个限制:

      • 动态图集尺寸最大是 2048 * 2048
      • 碎图的尺寸默认不能超过 512,可通过 API 进行修改:cc.dynamicAtlasManager.maxFrameSize = 512

      tips: 启用动态合图会增大内存消耗,不同平台占用内存不一致。小游戏和原生平台默认禁止动态合图。可以通过 api 自行开启:cc.macro.CLEANUP_IMAGE_CACHE = false; cc.dynamicAtlasManager.enabled = true;
      还需要保证纹理的 Premulyiply Alpha(预乘)、Wrap Mode(循环模式) 和 Filter Mode(过滤模式) 等信息与动态图集一致才能够动态合批。

      另外,静态图集也能参与动态合图,只要满足动态合图的要求即可。
      tip1: 自动图集资源(Auto Atlas)需要在其属性检查器面板中开启 Texture 栏下的 Packable 选项,该选项默认是禁用的。
      tip2: 精灵(Sprite)也是需要开启 Packable 选项才能动态合图。该选项默认是开启的。
      tip3: 如果要使用了 shader ,那么需要禁用该精灵的 Packable 选项。

      针对 Label

      位图字体(BMFont)

      在 Creator 中使用系统字体或 TTF 字体的 Label 会打断渲染合批,特别是 Label 和 Sprite 层叠交错的情况,每一个 Label 都会打断合批增加一个 DrawCall。

      因此建议使用 BMFont 来代替 TTF 或系统字体,并且将 BMFont 与 UI 碎图打包到同一图集中(或「开启动态合图」),可以免除大部分文本导致的 DrawCall增加。

      文本缓存模式(Cache Mode)

      Creator 2.0.9 版本在 Label 组件上增加了 Cache Mode 选项,来解决系统字体和 TTF 字体带来的性能问题。
      CacheMode有三种选项:

      • NONE(默认) 每一个 Label 都会生成为一张单独的位图,且不会参与动态合图,所以每一个 Label 都会打断渲染合批
      • BITMAP 开启 BITMAP 模式后,文本同样会生成为一张位图,但是只要符合动态合图要求就可以参与动态合图,和周围的精灵合并 DrawCall 。一定要注意 BITMAP 模式只适用于不频繁更改的文本,否则内存会爆炸。
      • CHAR 开启 CHAR 模式后,引擎会将该 Label 中出现的所有字符缓存到一张全局共享的位图中,相当于是生成了一个 BMFont 。适用于文本频繁更改的情况,对性能和内存最友好。tip: 该模式 只能用于字体样式和字号固定,并且不会频繁出现巨量未使用过的字符 的 Label。因为共享位图的最大尺寸为 2048*2048,占满了之后就没办法再渲染新的字符,需要切换场景才会清除共享位图。

      总结:对于大量频繁更改的文本,使用 CHAR 模式带来的性能提升是非常明显的。
      同时 CHAR 模式的局限也很明显,一般用于场景中出现大量数字文本,类似于经验值增加、血量减少之类的特效的情况

      必经之路–调整UI层级顺序

      原则:

      分离图像节点和文本节点文本使用 BMFont 或 Cache Mode 选项,尽量出现避免文本打断渲染合批的情况FBI WARNING: 一个 Mask 组件及其控制的渲染节点,需要至少三次 Draw call。第一次开启模板测试并调用一次 Draw call,刷新模板缓冲。第二次绘制对需要通过模板测试的区域进行设置。第三次再进行实际的子节点内容绘制,绘制结束再关闭模板测试。因此 使用 Mask 组件就无法与其他相邻节点进行批次处理 ,但是 Mask 组件内部的连续节点在满足合并规则的情况下还是会进行合批。

      总结

      改变渲染状态会打断渲染合批,例如改变纹理状态(预乘、循环模式和过滤模式)或改变 Material(材质)、Blend(混合模式)等等,所以使用自定义 Shader 也会打断合批。图集默认不参与动态合图,手动开启自动图集资源的 Packable 选项后如果最终图集符合动态合图要求也可以参与动态合图。纹理开启 Packable 选项参与动态合图后无法使用自定义 Shader,因为动态合图会修改原始贴图的 UV 坐标。使用 Cache Mode 的 BITMAP 模式需要注意内存情况,CHAR 模式需要注意文本内容不宜过多。在 ***Cocos Creator 2.0.7 之前的版本***中,改变节点的颜色或透明度、Sprite 组件使用九宫格(Sliced)都会打断渲染合批

      以上就是详解CocosCreator优化之DrawCall的详细内容,更多关于CocosCreator优化DrawCall的资料请关注自由互联其它相关文章!