Unity对象与Draw Calls的关系

Posted 小蔡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity对象与Draw Calls的关系相关的知识,希望对你有一定的参考价值。

什么是Draw Calls?

首先我们先来了解一下,什么叫做“Draw Calls”:一个Draw Call,等于呼叫一次 DrawIndexedPrimitive (DX) or glDrawElements (OGL),等于一个 Batch。

摸过 DirectX 或 OpenGL 的人来说,对 DrawIndexedPrimitive 与 glDrawElements 这 API 一定不陌生。当我们准备好资料 (通常为三角面的顶点资讯) 要 GPU 划出来时,一定得呼叫这个函式。换句话说,如果在画面上有一张 “木" 椅子、一张 “铁" 桌子,那理论上就会有两个 Draw Call。

有看到特别点出 “木" 与 “铁" 吗?这代表两物件是使用不同材质球或者不同的 Shader。在 DirectX 或 OpenGL 里,对不同物件指定不同贴图或不同 Shader 的描述,就会需要呼叫两次Draw Call。Procedure code如下:

SetShader(“Diffuse");
SetTexture(“铁");
DrawPrimitive(DeskVertexBuffer);

SetShader(“VertexLight");
SetTexture(“木");
DrawPrimitive(ChairVertexBuffer);

每次对 Shader 的更动或者贴图的更动,基本上就是对 Rendering Pipeline 的设定做修改,所以需要不同的 Draw Call 来完成物件的绘制。现在了解为什么 Unity 官方文件里,老是要你尽量使用同样材质球,以减少 Draw Call 数量了吧!

摄像机看到的对象与Draw Calls数值的关系:

现象一:所以对象都可见,都在摄像机范围内。

Draw Calls:27

 

现象二:后方的圆球被挡住。

Draw Calls还是为27,其他数值也没变过。

 

现象三:把一个对象[圆柱]移动到摄像机外面,完看不见。

这次的Draw Calls少了2,也就是当一个物体不在摄像机范围内,就不会产生Draw Calls,也就是GPU不会去画这个物品。

现象三:后面被挡住的圆球屏蔽,不显示;

这时候Draw Calls为20

 

数据比较:

 

 

总结:

我们要减少Draw Calls可以做到以下几点:

1、当调整摄像机的获取范围;

2、把一些遮档住的物品屏蔽,不要显示;

 

以上是关于Unity对象与Draw Calls的关系的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 5.0+模型合并&灯光烘焙降低Draw Calls方案

深入浅出聊优化:从Draw Calls到GC

深入浅出聊优化:从Draw Calls到GC

关于creator label渲染原理和draw call问题

[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls(代码片段

100个 Unity小知识点☀️ | Unity中使用代码查询Draw callTris和Verts等信息