关于Draw Call

根据3W法则来说明Draw Call

What?(什么是Draw Call)

Draw Call就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作。

例如,DirectX中的DrawIndexedPrimitive命令,OpenGL中的glDrawElement命令。

也可以说成,在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。

为了CPU和GPU可以并行工作,就需要一个命令缓冲区(Command Buffer)

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

命令缓冲区中的命令有很多种类,而Draw Call是其中的一种。

Why?(为什么Draw Call会影响性能)

在调用Draw Call前CPU需要把很多数据准备好,物体的顶点(包括本地位置、法线、UV等),索引(顶点如何组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等等数据。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。而一旦CPU完成了这些准备工作,GPU就可以开始本次的渲染。GPU的渲染能力是很强的,渲染速度往往快于CPU提交命令的速度。如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call命令上,造成CPU的过载。因此造成Draw Call性能问题的元凶是CPU。调用Draw Call的次数是决定性能比较重要的指标。

How?(如何减少Draw Call的数量)


在Unity 中提供来Dynamic Batching和Static Batching技术

https://gameinstitute.qq.com/community/detail/113040

https://gameinstitute.qq.com/community/detail/114323

参考:https://www.jianshu.com/p/061b84e4f863

猜你喜欢

转载自blog.csdn.net/iov3Rain/article/details/95043926