Unity_降低DrawCall

发布于 2020-07-14  21 次阅读


前言

这篇讲一下优化

正文

CPU和GPU并行工作的原理

为了CPU和GPU可以并行工作,就需要一个命令缓冲区(Command Buffer)。
命令缓冲区包含了一个命令队列,由CPU向其中添加命令,而由GPU从中读取命令。添加和读取的过程是相互独立的,因此命令缓冲区可以使CPU和GPU相互独立工作。当CPU需要渲染一些对象时,它可以向命令缓冲区添加命令,而GPU完成了上一次的渲染任务后,它就可以从命令队列里取出一个命令并执行它。

DrawCall是什么?

drawcall是CPU对底层图形绘制接口的调用 命令GPU执行渲染操作,也就是说CPU调用GPU的过程。

为什么DrawCall会影响帧率?

在每次调用Draw Call之前,CPU需要向GPU发送很多内容,包括数据,状态,命令等。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。
如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call命令上,造成CPU的过载。

UGUI是怎么绘制出UI的?

合批处理->合并mesh,合并mat,其实也就是绘制的mesh(UGUI的网格合并是在底层C++里进行的)。

UGUI的刷新机制是什么?

概念:脏标记 就是声明了一个变量 判断变量有没有变 有变就刷新。
例如:UI顶点被改变,材质球改变,布局改变,都会更新网格数据->发送到GPU进行渲染。

OverDraw是什么?

OverDraw是像素填充率,也就是说在UI遮挡的时候会增加,他会多渲染一遍,影响GPU的时间。

UGUI的是识别射线吗?

不是射线,这个射线对象,是只有要进行遮挡对象检测时,才会被用到的,也就是说这个射线对象是用来检测2D/3D物体对UI的遮挡的,而不是用来检测UI点击的,
UGUI的点击判断,是通过坐标计算出来的,而非是之前流传的射线检测

如何降低DrawCall?

  • UI方面
    • 取消不必要的Raycast
    • 拆分Canvas(比如说把经常更新的和不经常更新的分开)
    • 模块添加CanvasGrop进行显隐
    • 减少模块UI的叠加(尽量减少叠加)
  • 模型方面
    • 减少面数
    • 减少实时光照
    • 设置静态
    • 遮挡剔除

初步理解,如有不对,希望指出。


不积跬步,无以至千里;不积小流,无以成江海。