CocosCreator中如何优化DrawCall以提升性能?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1673个文字,预计阅读时间需要7分钟。
目录+前言+什么是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
动态图集有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分钟。
目录+前言+什么是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
动态图集有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的资料请关注自由互联其它相关文章!

