3分钟理解 批处理和drawcall有什么区别?
本人技术有限,如有错误,请道友们留言讨论,切勿口吐芬芳。
正文---------------------------------------------
批处理和drawcall不同点是什么呢?要从基本的概念说起:
第一个概念:什么是drawcall?
你的游戏每渲染一个物体,cpu就要向gpu发送一次渲染命令,这个渲染命令名字叫drawcall。
普及一下,渲染命令有很多种,drawcall是其中一种(见下图):
第二个概念:什么是批处理?
批处理的概念:简单理解就是1个批处理多个物体。
批处理的目的:
批处理就是在1个drawcall内尽可能多的处理多个物体。
所以批处理只是处理问题的一种方式。
举例说明:
假设你的项目要渲染1000个物体,这时就需要cpu发送给gpu 1000次drawcall渲染命令。
每发一次渲染命令,cpu就需要花费很多的时间来做准备。发的渲染命令多了,cpu就要挨个给渲染命令做准备,大家就开始排队,一排队就要堵。所以大家平常说的drawcall多了就卡顿,其实是排队引起的。
聪明的你就想,排队会引起卡顿,那么就尽量就不排队,尽量在发每次drawcall前就多为几个物体完成准备工作,最好1次把这个1000个渲染命令全部准备完。这就是批处理的思想了。
所以我们的目标就是将 1次drawcall只能处理1个或者几个物体的情况,经过优化后变成,1次drawcall可以处理更多个的物体的情况。
总结一下:
1 批处理和drawcall不同点是:
大家会发现这个问题本身就是错误的。
强行说区别就是:
我们口头说的drawcall指的是优化前的drawcall,是1次drawcall只能处理1个或者几个物体的情况
我们口头说的批处理指的是优化后的drawcall,就是1次drawcall可以处理更多个物体的情况。
2 批处理和drawcall相同点是:
批处理的数量是和drawcall数量是一样的。
再说一点:
如果一个项目的批处理数量越多,就说明批处理数越接近drawcall数。当他们越接近相等时,也就是越接近1个drawcall处理1个物体的情况。
这种情况出现就说明该项目批处理做的稀烂,赶紧重新做批处理吧。