浅谈draw call优化 Unity学习杂记(一)

1、何为draw call
每次CUP收集准备数据并通知GPU的过程称为一次Draw Call

看一下在Unity中的体现:

随便在场景中创建几个图片Sprite和文本Text,运行后在game的stats中可以看到Batches:7,代表drawcall的次数为七次,但是我这里只有两种材质球:图片和文本的材质球,加上天空和灯光,一共应该是四次drawcall才对,所以这里明显造成了性能的浪费。

drawcall详细的过程,在网上找得到资料总结起来就是:Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置、法线、UV等),(顶点如何组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像。

2、如何优化
优化的方法很简单,总结为一句话就是:不同材质球的渲染层级不要相交。

在这里插入图片描述
例如:图片的渲染层级,Depth在(0,10)之间,那么文本的层级,Depth可以在(10,20)之间,渲染层级的范围彼此间没有交集,就不会造成多余的drawcall。

下面这张图是我将图片和文本的Depth整理过后,显示的drawcall次数:

现在drawcall次数降低为了四次,正好是前面推断出来的次数。
在UGUI中: Depth就是在场景物体中存放的先后顺序,越靠前的优先渲染,那么Depth就越小。
在这里插入图片描述

3、drawcall渲染原理
在渲染时,程序会寻找材质球,寻找材质球的顺序就是依据物体的Depth,从小到大挨着来,假如十个物体Depth排序为 0 到 9,第一个就会找到Depth为 0 的材质球,这时不会去渲染,会继续寻找,找到Depth为 1 的材质球,假如找到的这两个材质球相同,那么就会继续寻找第三个材质球,直到遇到不同材质球,就会进行一次drawcall,渲染找到的第一种材质球,然后重复这个过程,直到所有物体渲染完成。
如图:在这里插入图片描述
上图可以看出,4个拥有相同材质球的物体,只进行了一次drawcall,和上面说的不同材质球的物体Depth不要有交集,可以有效减少drawcall次数。

4、drawcall的性能瓶颈 在CPU还是GPU
在渲染场景物体的时候,是由CPU收集处理顶点、法线UV、纹理、shader等信息,然后传递给GPU,渲染出来让我们看到。
在游戏的运行中,CPU的瓶颈是至关重要的。如果CPU的运行速度较慢,则GPU会出现等待CPU的情况,此时游戏主要受到CPU的限制。

以上就是我对drawcall优化粗浅的理解,欢迎大家来点评!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水星程序店

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值