作者:i_dovelemon
日期:2016 / 06 / 18
来源:CSDN
主题:batch, drawl call, performance
引言
最近,有个问题为什么在3D图形编程中,总是以draw call的数量来估测性能,draw call到底做了什么?它与GPU,CPU到底是什么关系?带着这个疑问,上网搜索了下相关的文章,发现在
Stackoverflow上有关于这个的讨论。在详细阅读了他们的讨论之后,发现有人给出了Nvidia的一篇文章“"Batch,Batch,Batch":What does it really mean?”。本篇文章将主要记录一些对该篇文章的理解。正如作者提出的那样,这篇文章很老,是否与现在的实际情况有出入,不得而知,但是整体上能够给我一个对draw call的初步了解。好了,废话不多说,开始正文吧!!!
Let's go
图1
图2
开篇,文章中就提出了Batch是什么,每当我们在API中调用DrawPrimitive之类的函数的时候,实际上就是向GPU提交三角形(一般来说)数据,一个Batch,具有同样的渲染状态,同样的纹理,同样的Transform。
图3
这里,他提出了一个问题,游戏绘制1百万个物体,而每一个物体具有10个三角形的性能和绘制10个物体,每一个物体具有1百万个三角形,哪个性能好,哪个速度更快?从书上或者其他途径,我们都了解后面一种实际上效率高。但是高的原因是什么,文中提出了一些常见的错误猜测:
(1)在GPU上进行状态切换不够快(错)
(2)在GPU上组织建立三角形很占用资源(错)
(3)内核中传输数据很慢(错)
看完这个之后,我就知道以前我的理解原来是错误的。除了上面的错误猜测之外,还提出了疑问“未来的GPU能够解决在两种绘制情况下都同样高效绘制的问题吗?”
图4