Unity学习笔记 Draw Call和性能

——读《Unity Shader入门精要》笔记

Draw Call简单理解就是CPU调用图像编程接口的一个命令。

一个常见的误区是:Draw Call中造成性能问题的元凶是GPU,认为GPU上的状态切换是耗时的,其实不是的,真正拖后腿的其实是CPU。

CPU和GPU并行工作的原理

通过命令缓冲区使得CPU和GPU可以并行工作,命令缓冲区包含了一个命令队列,由CPU向其中添加命令,而由GPU从中读取命名,这其中添加和读取的过程是相互独立的。
在这里插入图片描述

为什么Draw Call多了会影响帧率

在每次调用Draw Call之前,CPU需要向GPU发送很多内容,包括数据、状态和命令等。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。而一旦CPU完成了这些准备工作,GPU就可以开始本次的渲染。GPU的渲染能力是非常强的,往往渲染速度快于CPU提交命令的速度。也就是说,如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call上,造成CPU的过载,CPU都把时间花费在准备Draw Call的工作上。

那该怎么减少Draw Call呢

可以通过使用批处理(Batching)的方法,减少每一帧需要的Draw Call数目。
由于我们需要在CPU的内存中合并网格,而合并的过程是需要消耗时间的、批处理技术更加适合于静态的物体,例如不会移动的大地,石头等,对于这些静态物体只需要合并一次即可。当然,对动态物体也可以进行批处理,但是因为这物体是不断运动的,因此每一帧都需要重新进行合并然后再发送给GPU,这对空间和时间都会造成一定的影响。
在开发的过程中,应该注意:

  1. 避免使用大量很小的网格。但不可避免的需要使用很小的网格结构时,考虑是否可以合并他们。
  2. 避免使用过多的材质。尽量在不同的网格之间共用同一个材质。

猜你喜欢

转载自blog.csdn.net/weixin_42358083/article/details/122750617