Draw Call就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作。

例如,DirectX中的DrawIndexedPrimitive命令,OpenGL中的glDrawElement命令。

1.CPU和GPU并行工作的原理

为了CPU和GPU可以并行工作,就需要一个命令缓冲区(Command Buffer)

命令缓冲区包含了一个命令队列,由CPU向其中添加命令,而由GPU从中读取命令。添加和读取的过程是相互独立的,因此命令缓冲区可以使CPU和GPU相互独立工作。当CPU需要渲染一些对象时,它可以向命令缓冲区添加命令,而GPU完成了上一次的渲染任务后,它就可以从命令队列里取出一个命令并执行它。

命令缓冲区中的命令有很多种类,而Draw Call是其中的一种,其它命令还有改变渲染状态等命令(改变使用的Shader,使用不同的纹理等)。

2.为什么 Draw Call多了会影响帧率?

在每次调用Draw Call之前,CPU需要向GPU发送很多内容,包括数据,状态,命令等。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。而一旦CPU完成了这些准备工作,GPU就可以开始本次的渲染。GPU的渲染能力是很强的,渲染300个和3000个三角网格通常没有什么区别,因此渲染速度往往快于CPU提交命令的速度。如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call命令上,造成CPU的过载。

*因此造成Draw Call性能问题的元凶是CPU。

3.如何减少DrawCall?

提交大量很小的Draw Call会造成CPU的性能瓶颈,即CPU把时间都花费在准备Draw Call的工作上了。那么,一个很显然的优化想法就是把很多小的Draw Call合并成一个大的Draw Call,这就是批处理的思想。

需要注意的是,由于我们需要在CPU的内存中合并网格,而合并的过程是需要消耗时间的。因此,批处理更适合静态的物体,例如不会移动的大地,石头等,对于这些静态物体我们只需合并一次即可。当然,我们也可以对动态物体进行批处理。但是,由于这些物体是不断运动的,因此每一帧都需要重新进行合并然后再发送给GPU,这对空间和时间都会造成一定的影响。

本文转自简书
作者:SwordMaster
链接:https://www.jianshu.com/p/061b84e4f863

Draw Call是什么?相关推荐

  1. (转)Unity3D - 性能优化之Draw Call

    Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置.法线.UV等),索引(顶点如 ...

  2. DeepMind提图像生成的递归神经网络DRAW,158行Python代码复现

    作者 | Samuel Noriega 译者 | Freesia 编辑 | 夕颜 出品 | AI科技大本营(ID: rgznai100) [导读]最近,谷歌 DeepMInd 发表论文( DRAW: ...

  3. matplotlib可视化基本散点图、在图像指定区域绘制方框(Draw Rectangle)

    matplotlib可视化基本散点图.在图像指定区域绘制方框(Draw Rectangle) 目录 matplotlib可视化基本散点图.在图像指定区域绘制方框(Draw Rectangle)

  4. matplotlib可视化基本散点图、在图像多个指定区域绘制方框、进行自定义色彩填充(Draw Multiple Rectangles)

    matplotlib可视化基本散点图.在图像多个指定区域绘制方框.进行自定义色彩填充(Draw Multiple Rectangles) 目录

  5. matplotlib可视化基本散点图、在图像指定区域绘制方框并进行自定义色彩填充(Draw Rectangle filled with color)

    matplotlib可视化基本散点图.在图像指定区域绘制方框并进行自定义色彩填充(Draw Rectangle filled with color) 目录

  6. 158行Python代码复现:DeepMind提图像生成的递归神经网络DRAW

    授权自AI科技大本营(ID:rgznai100) 本文约5200字,建议阅读10+分钟. 本文作者基于代码实现系统的思路,详细阐述了 DRAW 的概念.架构和优势等. [ 导读 ]最近,谷歌 Deep ...

  7. (深入理解)matplotlib的交互模式(block,interactive,ion,ioff,draw,show,plot等的区别)

    文章目录 interactive,ion,ioff draw,show,plot draw show,plot 拓展 import matplotlib.pyplot as plt import nu ...

  8. Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析(上)...

    在前面一篇文章中,我们分析了Android应用程序窗口的绘图表面的创建过程.Android应用程序窗口的绘图表面在创建完成之后,我们就可以从上到下地绘制它里面的各个视图了,即各个UI元素了.不过在绘制 ...

  9. java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap.

    java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap. 异常原因分析:Canvas绘制 ...

  10. Direct3D Draw函数 异步调用原理解析

    概述 在D3D10中,一个基本的渲染流程可分为以下步骤: 清理帧缓存: 执行若干次的绘制: 通过Device API创建所需Buffer: 通过Map/Unmap填充数据到Buffer中: 将Buff ...

最新文章

  1. selenium 常用操作
  2. 9、计算机图形学——纹理的应用(环境贴图、凸凹贴图、法线贴图以及位移贴图)
  3. 程序员 :超越软件蓝领的七种武器
  4. python基础——使用__slots__
  5. java时间格式转js_使用jquery或java脚本将日期时间转换为rfc3339格式
  6. OpenGL在MFC下编程原理
  7. mongodb之索引使用小结
  8. JavaScript中的match方法和search方法
  9. An App ID with Identifier 'com.XXX.XXX’ is not available. Please enter a different string.报错
  10. linux 下的绘图软件Visio——流程图,矢量图
  11. mysql数据库自动备份软件SQLBackupAndFTP简介(图文)
  12. EXCEL预览正常,打印却是空白的解决方法之一
  13. 催收公司承信科技申请纳斯达克IPO上市,募资1500万美元
  14. R语言进行多重样本t检验代码问题
  15. Decision Transformer 前沿追踪——万物皆可归于序列预测
  16. 见到了故事中的人,搜狗输入法之父:马占凯
  17. Kali利用0DAY漏洞CVE-2018-8174获取shell权限
  18. 思科2960恢复系统
  19. RTT-Studio实战-流水灯
  20. 访问WEB-INF下的资源

热门文章

  1. oracle adump aud,Oracle中大量无用小文件可能带来的问题及解决方法
  2. Ubuntu下 安装及使用mplayer视频播放器
  3. 图神经网络GNN在推荐系统的应用:综述
  4. 抖音视频怎么拼接?分享一款功能强大的软件
  5. 全天候道路图像分割数据集UAS(UESTC All-Day Scenery)介绍
  6. PSAM嵌入式驱动——GD32模拟01
  7. RC5编码格式的遥控器解码、PCA9633器件控制代码示例、串口通信程序示例、IIC通信示例
  8. 微商营销实战技巧分享,轻松月入10W
  9. 别不信!掌握好这20个Linux命令常用项,可加薪30%
  10. git命令之branch