每次游戏卡的时候,策划总问:是不是DrawCall太高了?

点击上方亿元程序员+关注和★星标

引言


"玩家反馈这个界面好卡啊!"

"测试机帧率都掉到个位数了!"

"是不是因为DrawCall太高了?"

最近某个策划同事总是发出类似这样的灵魂拷问。

不知道是不是 上次游戏卡的时候给他提了一下DrawCall这个专业名词。

并且告诉了他在哪里可以查看这个数值:

结果一发不可收拾, DrawCall就成了他的口头禅。

贴心的他 ,有一次还发来一条商城链接,"kkk动态合批 ","不行你就用这个吧,99也不贵"。

大佬 ,有没有什么好办法把DrawCall降下来的同时,还能省下99


哈喽大家好,感谢上面粉丝提供的素材。

看完这个故事,同为程序的你,是不是心头一紧,五味杂陈?

一方面 ,"DrawCall"这个概念已经深入人心,不再是程序自己的黑话。

另一方面,你又哭笑不得,因为这感觉就像:"车开不动了,别人就问是不是发动机的螺丝没拧紧?"

这一期 ,我们重点聊一下DrawCall。各位看完能不能省99 不好说,但是可以有一定的了解。(注意,游戏卡顿其实原因很多,本文主要探讨DrawCall

1.什么是DrawCall?

DrawCallCPU 通过图形API (如OpenGL/DirectX )向GPU 发送的绘制指令 ,包含网格数据、材质参数和渲染状态等信息。‌‌

为什么DrawCall高会卡?

可以这么通俗地理解:

把策划 比作CPU ,把程序 比作GPU ,那么下单一次的完整需求,我们可以比作一次DrawCall,程序能很快并且很好地完成需求(DrawCall低,游戏不卡)。

但是 ,如果策划 下单需求之后,分多次再下单调整UI修改玩法补充内容 ,不停地打断程序 的"施法 ",导致需求迟迟不能完成(DrawCall高,游戏卡顿)。

因此 我们需要想办法把DrawCall降下来,回到上面的例子就是把策划提的需求完整化,一次提完,实在不行就去解决策划 ,毕竟瓶颈在CPU

那有什么办法可以将DrawCall降下来呢?

2.老规矩,上例子

接下来 给大家演示一个简单的降低DrawCall的例子,但是不同的项目有不同的难度,本例子只做演示。

1.准备资源

首先 还是准备一下资源,有美术搭子的找美术搭子,没有美术搭子的找AI搭子(下期给大家分享一下)。

2.拼UI

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

3.写代码

首先 绑定一下资源和脚本,包括背景、图标和名字

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

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

下面 我们尝试一下降低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个了。

有什么办法 可以合并LabelDrawCall吗?

答案 是有的,我们可以设置Label 的文本缓存模式为BITMAP

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

3.进阶

现实项目并不能像示例中那么简单粗暴,可以采用以下思路:

在渲染前阶段 (EVENT_BEFORE_DRAW)

  • 记录原始节点结构
  • 创建新的层级结构

在渲染后阶段 (EVENT_AFTER_DRAW)

  • 恢复原始节点结构

结语

看完的小伙伴 ,是不是觉得99非常值了。

卡顿的原因 其实还有很多,策划不喊DrawCall了,小伙伴们知道还可以喊哪些吗?

本文源工程 可通过私信 发送 DrawCall 获取。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。

实不相瞒,想要个爱心 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

知识付费专栏

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

点击下方灰色按钮+关注。

相关推荐
golang学习记6 小时前
刚刚,OpenAI首个AI浏览器发布!颠覆Chrome,彻底改变你上网的方式|附实测
前端
吃饺子不吃馅6 小时前
项目上localStorage太杂乱,逼我写了一个可视化浏览器插件
前端·javascript·chrome
golang学习记6 小时前
从0 死磕全栈之Next.js 环境变量实战指南:企业级多环境(dev/test/prod)配置最佳实践
前端
.生产的驴7 小时前
React 集成Redux数据状态管理 数据共享 全局共享
前端·javascript·react.js·前端框架·css3·html5·safari
IT_陈寒7 小时前
Redis性能优化的7个隐藏技巧:从慢查询到亿级QPS的实战经验分享
前端·人工智能·后端
艾小码7 小时前
ES6+革命:8大特性让你的JavaScript代码质量翻倍
前端·javascript
两个西柚呀7 小时前
Vue组件的一些底层细节
前端·javascript·vue.js
IT技术分享社区7 小时前
前端:浏览器Content Security Policy 安全策略介绍和用法
前端·前端开发
林强18111 小时前
前端文件预览docx、pptx和xlsx
前端