关于游戏运行drawcall和cpu
2019-06-19 本文已影响0人
mcgee0731
理解drawcall
和cpu
1. CPU和GPU并行工作的原理
- 为了
CPU
和GPU
可以并行工作,就需要一个命令缓冲区(Command Buffer)
- 命令缓冲区包含了一个命令队列,由CPU向其中添加命令,而由GPU从中读取命令。
- 添加和读取的过程是相互独立的,因此命令缓冲区可以使CPU和GPU相互独立工作。
- 当
CPU
需要渲染一些对象时,它可以向命令缓冲区添加命令,而GPU
完成了上一次的渲染任务后,它就可以从命令队列里取出一个命令并执行它。 - 命令缓冲区中的命令有很多种类,而
Draw Call
是其中的一种,其它命令还有改变渲染状态等命令(改变使用的Shader,使用不同的纹理等)。
2. 什么是Draw Call?
-
drawcall
是CPU
对底层图形绘制接口的调用命令GPU
执行渲染操作 -
Draw Call
就是CPU
调用图形编程接口,比如DirectX
或OpenGL
,来命令GPU
进行渲染的操作。
3. 为什么 Draw Call多了会影响帧率?
- 在每次调用
Draw Call
之前,CPU
需要向GPU
发送很多内容,包括数据,状态,命令等。在这一阶段,CPU
需要完成很多工作,例如检查渲染状态等 - 而一旦
CPU
完成了这些准备工作,GPU
就可以开始本次的渲染。GPU
的渲染能力是很强的,渲染300个和3000个三角网格通常没有什么区别,因此渲染速度往往快于CPU
提交命令的速度。 - 如果Draw Call的数量太多,CPU就会把大量时间花费在提交
Draw Call
命令上,造成CPU
的过载。 - 因此造成Draw Call性能问题的元凶是CPU。
4. 如何减少DrawCall?
- 提交大量很小的
Draw Call
会造成CPU
的性能瓶颈,即CPU把时间都花费在准备Draw Call
的工作上了。 - 那么,一个很显然的优化想法就是把很多小的
Draw Call
合并成一个大的Draw Call
,这就是批处理的思想。
drawcall
是CPU
对底层图形绘制接口的调用命令 GPU
执行渲染操作
例如 :
DirectX中的DrawIndexedPrimitive命令
OpenGL中的glDrawElement命令