浅谈Draw Call和Batch的区别
来源:互联网 发布:淘宝加盟店辨别真假 编辑:程序博客网 时间:2024/06/06 10:49
开发游戏时,一定被时时提醒要减少 Draw Call,当然Unity也不例外,打开Game Window里的 Stats,可以看到 Draw Call 与 Batched 的数字。但到底什么是 Draw Call?影响的效能是来自 CPU?还是 GPU?
首先,让我们定义何为 “Draw Call”:
“一个 Draw Call,等于呼叫一次 DrawIndexedPrimitive (DX) or glDrawElements (OGL),等于一个 Batch”
摸过 DirectX 或 OpenGL 的人来说,对 DrawIndexedPrimitive 与 glDrawElements 这 API 一定不陌生。当我们准备好资料 (通常为三角面的顶点资讯) 要 GPU 划出来时,一定得呼叫这个函式。换句话说,如果在画面上有一张 “木" 椅子、一张 “铁" 桌子,那理论上就会有两个 Draw Call。
有看到特别点出 “木" 与 “铁" 吗?这代表两物件是使用不同材质球或者不同的 Shader。在 DirectX 或 OpenGL 里,对不同物件指定不同贴图或不同 Shader 的描述,就会需要呼叫两次Draw Call。Procedure code如下:
1SetShader( “Diffuse" );2SetTexture( “铁" );3DrawPrimitive( DeskVertexBuffer );45SetShader( “VertexLight" );6SetTexture( “木" );7DrawPrimitive( ChairVertexBuffer );
每次对 Shader 的更动或者贴图的更动,基本上就是对 Rendering Pipeline 的设定做修改,所以需要不同的 Draw Call 来完成物件的绘制。现在了解为什么 Unity 官方文件里,老是要你尽量使用同样材质球,以减少 Draw Call 数量了吧!
再来谈到 Batch,其实也是 Draw Call 的另一种称呼。你可以想成每一次的 Draw Call 会产生一个 Batch,而 Batch 里装的是物件顶点资料,Batch 由 CPU 透过 “驱动程式” 将顶点资料送往 GPU,GPU接手后将物件画在画面上。由此可知,越多 Draw Call,CPU 就越忙碌。这下更清楚知道 Draw Call 数量所影响的是 CPU 效能而非 GPU。
NVIDIA 在 GDC 曾提出,25K batchs/sec 会吃满 1GHz 的 CPU,100的使用率。所以他们推出了一条公式,来预估游戏中大概可以 Run 多少个 Batch:
举个例子:如果你的目标是游戏跑30FPS、使用2GHz的CPU、20š„工作量拨给Draw Call来使用,那你每秒可以有多少Draw Call呢?
333 Batchs/Frame = 25K * 2 * (0.2/30)
那既然 Batch 是个箱子,里头装着物件的顶点资料,再依据我们上面的描述,那表示同样材质或 Shader 的物件,可以合并成一个 Batch 送往 GPU,这样就是最省事的方法!
Unity在 Player Setting 里的两个功能选项 Static Batching 与 Dynamic Batching。功能描述如下:
- Static Batching 是将标明为 Static 的静态物件,如果在使用相同材质球的条件下,Unity 会自动帮你把这两个物件合并成一个 Batch,送往 GPU 来处理。这功能对效能上非常的有帮助,所以是需要付费才有的。
- Dynamic Batching 是在物件小于300面的条件下(不论物件是否为静态或动态),在使用相同材质球下,Unity就会自动帮你合合并成一个 Batch 送往 GPU 来处理。
- 浅谈Draw Call和Batch的区别
- 浅谈Draw Call和Batch的区别
- 浅谈Draw Call和Batch的区别
- 浅谈Draw Call和Batch的区别
- 浅谈Draw Call和Batch的区别
- 【unity扫盲】什么是Draw Call? 什么是Batch?
- Custom draw 和 Owner draw 的区别
- Draw Call 理解和优化
- Draw Call介绍和优化
- 关于Draw call的资料
- 减少Draw Call的方法
- View中的draw和onDraw的区别
- View中的draw和onDraw的区别
- View中的draw和onDraw的区别
- View中的draw和onDraw的区别
- View中的draw和onDraw的区别
- draw able和mipmap的区别
- Draw Call
- hdu1010 Tempter of the Bone
- 避免刷新页面时重复提交表单数据
- linux 设置 IP 掩码 网关操作命令
- 从源码出发了解RxJava的使用(上)
- [Ruby On Rails] form_for 中的一些参数使用以及得到 params
- 浅谈Draw Call和Batch的区别
- 51Nod-1080-两个数的平方和
- 重建二叉树
- Mongodb 数据类型
- 332. Reconstruct Itinerary
- 利用选择排序为shell排序提速
- 执行shell脚本报错 cannot execute binary file
- Android Service与Activity之间通信的几种方式
- 项目搭建git和github的使用