Cocos Creator性能优化-3-DrawCall

1.DrawCall是什么?

CPU和GPU是并行工作的,它们之间存在一个命令缓冲区。当CPU需要调用图形编程接口的时候就会往命令缓冲区里面增加命令,当GPU完成上一次渲染命令的时候就会继续从命令缓冲区中执行下一条命令,命令缓冲区里面的命令有很多中,而drawcall就是其中的一种。CPU在提交drawcall的时候需要处理很多东西,比如一些数据、状态、命令等等,有些渲染卡顿问题就是因为GPU渲染速度比drawcall的提交速度快,可能上一次渲染完了,CPU还在计算drawcall,所以drawcall的性能瓶颈在于CPU。优化drawcall最有效的方法合批渲染,就是把大量小的drawcall合并成大的drawcall,减少drawcall的数量。
总而言之—DrawCall 是CPU 调用图形 API,命令 GPU 进行图形绘制指令

2.为什么减少DrawCall?

每一次 DrawCall 前,CPU 都需要做一系列准备工作,才能让 GPU 正确渲染出图像。而 CPU 的每一次内存显存读写、数据处理和渲染状态切换都会带来一定的性能和时间消耗。一般来说CPU 的内存显存读写、数据处理和渲染状态切换相对于 GPU 渲染来说非常慢。大量的 DrawCall 会让 CPU 忙到不可开交,而 GPU 大部分时间都在摸鱼,是导致游戏性能下降的主要原因。

3.如何减少DrawCall!

原理:减少DrawCall就是要减少改变渲染状态的因素,尽可能的进行"渲染合批"
1.静态合图以及动态合图
1.静态合图:
可以将指定的一系列碎图打包成一张大图,尽可能使画面中的节点使用同一个图集,同图集下的纹理状态是一致的可以达到渲染合批的需求。

常使用静态合图方式:cocos的自动图集以及TexturePacker、BMFont(字体)

使用注意点:
1.图集最大尺寸最好控制在 2048 * 2048 以内,可以对图片进行拆分,用小图组成 ,尽可能填充图集,背景图太大不建议放入图集、善用九宫格。
2. 尽量将处于同一界面(UI)下的相邻且渲染状态相同的碎图打包成图集
3. 在场景中使用系统字体或 TTF 字体的 Label 会打断渲染合批,特别是 Label 和 Sprite 层叠交错的情况,对于游戏中的文本,特别是数字、字母和符号,都建议 使用 BMFont 来代替 TTF 或系统字体,并且 将 BMFont 与 UI 碎图打包到同一图集中(或 开启动态合图),可以免除大部分文本导致的 DrawCall

2.动态合图:
它能在项目运行时动态的将贴图合并到一张大贴图中。当渲染一张贴图的时候,动态合图系统会自动检测这张贴图是否已经被合并到了图集(图片集合)中,如果没有,并且此贴图又符合动态合图的条件,就会将此贴图合并到图集中。

引擎的动态图集可分为:
1.散图及使用 BITMAP 模式的文本提供的动态图集,最大数量为 5 张,尺寸为 2048 * 2048。
Cocos Creator性能优化-3-DrawCall_第1张图片
对于内容不会改变的静态文本可以使用BITMAP
在这里插入图片描述

2.是为使用 CHAR 模式的文本提供的字符图集,单个场景只有 1 张,尺寸为 2048 * 2048。
对于频繁更新但文本字符内容有限的文本可以使用 CHAR
在这里插入图片描述
设置为 CHAR 模式,进行字符缓存,将单个字符文本添加到字符图集中。这样缓存一次之后,后续所有的数字组合都可以从已缓存的字符中获取

动态合集方式对比
第一种演示
Cocos Creator性能优化-3-DrawCall_第2张图片
第二种演示
Cocos Creator性能优化-3-DrawCall_第3张图片
使用注意点:
1.动态图集尺寸最大是 2048 * 2048,可合并的 碎图限制的最大尺寸是 512
可以通过cc.dynamicAtlasManager.maxFrameSize = 512 修改。
2.动态合图会占用额外的内存,小游戏和原生平台上默认会禁用动态合图。可以通过以下开启

cc.macro.CLEANUP_IMAGE_CACHE = false;
cc.dynamicAtlasManager.enabled = true;

3.静态图集满足动态合图的要求(即尺寸小于碎图限制的最大尺寸),也是可以参与动态合图的。自动图集资源(Auto Atlas)需要在其属性检查器面板中开启 Texture 栏下的 Packable 选项,该选项默认是禁用的。
4.动态图集在切换场景时会进行清理释放

总结:尽可能使渲染状态相同的节点通过优化节点层级,分离图像节点和文本节点,善用静态和动态合图以达到渲染合批的情况

你可能感兴趣的:(CocosCreator,#,Cocos-性能优化,性能优化)