点击上方亿元程序员+关注和★星标
引言
"玩家反馈这个界面好卡啊!"
"测试机帧率都掉到个位数了!"
"是不是因为DrawCall太高了?"
最近某个策划同事总是发出类似这样的灵魂拷问。
不知道是不是 上次游戏卡的时候给他提了一下DrawCall这个专业名词。
并且告诉了他在哪里可以查看这个数值:

结果一发不可收拾, DrawCall就成了他的口头禅。
贴心的他 ,有一次还发来一条商城链接,"kkk动态合批 ","不行你就用这个吧,99也不贵"。
大佬 ,有没有什么好办法把DrawCall降下来的同时,还能省下99?
哈喽大家好,感谢上面粉丝提供的素材。
看完这个故事,同为程序的你,是不是心头一紧,五味杂陈?
一方面 ,"DrawCall"这个概念已经深入人心,不再是程序自己的黑话。
另一方面,你又哭笑不得,因为这感觉就像:"车开不动了,别人就问是不是发动机的螺丝没拧紧?"
这一期 ,我们重点聊一下DrawCall。各位看完能不能省99 不好说,但是可以有一定的了解。(注意,游戏卡顿其实原因很多,本文主要探讨DrawCall)
1.什么是DrawCall?
DrawCall 是CPU 通过图形API (如OpenGL/DirectX )向GPU 发送的绘制指令 ,包含网格数据、材质参数和渲染状态等信息。
那 为什么DrawCall高会卡?
可以这么通俗地理解:
把策划 比作CPU ,把程序 比作GPU ,那么下单一次的完整需求,我们可以比作一次DrawCall,程序能很快并且很好地完成需求(DrawCall低,游戏不卡)。
但是 ,如果策划 下单需求之后,分多次再下单调整UI 、修改玩法 、补充内容 ,不停地打断程序 的"施法 ",导致需求迟迟不能完成(DrawCall高,游戏卡顿)。
因此 我们需要想办法把DrawCall降下来,回到上面的例子就是把策划提的需求完整化,一次提完,实在不行就去解决策划 ,毕竟瓶颈在CPU。
那有什么办法可以将DrawCall降下来呢?
2.老规矩,上例子
接下来 给大家演示一个简单的降低DrawCall的例子,但是不同的项目有不同的难度,本例子只做演示。
1.准备资源
首先 还是准备一下资源,有美术搭子的找美术搭子,没有美术搭子的找AI搭子(下期给大家分享一下)。

2.拼UI
简单拼一下UI,期待哪天AI能够彻底解决拼UI问题,那会减少多少矛盾啊!

3.写代码
首先 绑定一下资源和脚本,包括背景、图标和名字。

然后 创建列表项,按顺序设置背景、图标和名字。

运行 之后,我们可以看到不做任何处理的情况下,一共19 个DrawCall(Canvas 占1个)。

下面 我们尝试一下降低DrawCall。
4.合图
上面 每渲染一个节点,便产生一个DrawCall,想要不额外增加DrawCall,相邻的两个渲染对象的材质与贴图要相同。
讲到这里 ,大家应该知道要打图集了。
给大家列举2种方式:
1.手动合图
手动合图 我们通常使用第三方软件TexturePacker。
使用方式 也比较简单,将散图拖进去,修改格式和路径,然后发布精灵集即可。

生成的图集:

最后通过脚本绑定图集,并且更换为图集中的图片:

2.自动图集
自动图集 作为Cocos Creator 自带的合图功能,可以将指定的一系列碎图打包成一张大图,具体作用和TexturePacker的功能很相近。
我们 可以通过右键要使用自动图集的图片目录-创建-自动图集配置使用。

生成 的auto-atlas文件:

注意 :预览项目 或者在Cocos Creator中使用碎图的时候都是直接使用的碎图资源 ,在构建项目这一步才会真正生成图集到项目中。意思就是:
自动图集需要发布之后才能看到效果
5.查看效果
图集处理好之后 运行看下效果,使用图集之后,DrawCall降低到13个了。

很明显 ,虽然背景、图标合并了,但是项与项之间的渲染被Label打断了。
6.处理Label
因为 我们的渲染被Label 打断了,那么我们简单粗暴地将Label移走不就好了?
于是 我们尝试一下,将Label从项中移出来。

这样 我们的DrawCall降低到8个了。

有什么办法 可以合并Label 的DrawCall吗?
答案 是有的,我们可以设置Label 的文本缓存模式为BITMAP。

这样 我们的DrawCall就降低到3个了。

3.进阶
现实项目并不能像示例中那么简单粗暴,可以采用以下思路:
在渲染前阶段 (EVENT_BEFORE_DRAW)
- 记录原始节点结构
- 创建新的层级结构
在渲染后阶段 (EVENT_AFTER_DRAW)
- 恢复原始节点结构
结语
看完的小伙伴 ,是不是觉得99非常值了。
卡顿的原因 其实还有很多,策划不喊DrawCall了,小伙伴们知道还可以喊哪些吗?
本文源工程 可通过私信 发送 DrawCall 获取。
我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。
AD:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。
实不相瞒,想要个赞 和爱心 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!
推荐专栏:
点击下方灰色按钮+关注。