(转)Unity_什么是Draw Call? 什么是Batch?
開發遊戲時,一定被時時提醒要減少 Draw Call,當然UNITY也不例外,打開Game Window裡的 Stats,可以看到 Draw Call 與 Batched 的數字。但到底甚麼是 Draw Call?影響的效能是來自 CPU?還是 GPU?讓 UnityIN 一次告訴你。

首先,讓我們定義何為 “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如下:
SetShader( “Diffuse" );
SetTexture( “鐵" );
DrawPrimitive( DeskVertexBuffer );
SetShader( “VertexLight" );
SetTexture( “木" );
DrawPrimitive( ChairVertexBuffer );
每次對 Sahder 的更動或者貼圖的更動,基本上就是對 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呢?
那既然 Batch 是個箱子,裡頭裝著物件的頂點資料,再依據我們上面的描述,那表示同樣材質或 Shader 的物件,可以合併成一個 Batch 送往 GPU,這樣就是最省事的方法搂?BINGO!就是這樣沒錯!
UNITY 在 Player Setting 裡的兩個功能選項 Static Batching 與 Dynamic Batching。功能描述如下:
- Static Batching 是將標明為 Static 的靜態物件,如果在使用相同材質球的條件下,UNITY 會自動幫你把這兩個物件合併成一個 Batch,送往 GPU 來處理。這功能對效能上非常的有幫助,所以是需要付費才有的。
- Dynamic Batching 是在物件小於300面的條件下(不論物件是否為靜態或動態),在使用相同材質球下,UNITY就會自動幫你合併成一個 Batch 送往 GPU 來處理。
底下是另一篇對岸高手寫的相關文章,以及 NVIDIA 在 GDC 曾經探討的一個Topic,三篇一起服用效果更佳:
(转)Unity_什么是Draw Call? 什么是Batch?的更多相关文章
- 圆角矩形shader
在游戏中,有时需要对一张矩形图片进行切割,绘制成圆角矩形. circelrect.vert attribute vec4 a_position; attribute vec4 a_normal; at ...
- libgdx学习记录19——图片动态打包PixmapPacker
libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题 ...
- libgdx学习记录17——照相机Camera
照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. C ...
- libgdx学习记录1——图片显示Texture
libgdx底层采用opengl渲染,对图片进行了优化处理,与android原生态的bitmap不太一样. 相比而言,效率要高一些,不过只支持png,jpg,bmp三种格式. 显示中,一般将图片放在a ...
- libgdx 环境搭建
1:环境搭建: (1)首先进入官网,http://libgdx.badlogicgames.com/download.html 点击下方的Releases.进行下载最新的版本号就可以. 这个为我们开 ...
- Libgdx window add alpha action change the background actor alpha
现象: Stage中包括一个Window,一个Actor,Window中加入alpha action后,Actor也随之消失:Actor加入alpha action后,不起作用. 解决: 重写draw ...
- [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader
高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...
- [libgdx游戏开发教程]使用Libgdx进行游戏开发(6)-添加主角和道具
如前所述,我们的主角是兔子头.接下来我们实现它. 首先对AbstractGameObject添加变量并初始化: public Vector2 velocity; public Vector2 term ...
- [libGDX游戏开发教程]使用Libgdx进行游戏开发(5)-关卡加载
在上一章我们介绍了如何管理和利用素材,但是我们注意到,这些素材都是零散的,比如岩石的左部等,这一章,我们将利用这些零件拼合成完整的游戏对象. 回顾最开始的设计类图,注意Level类和所有Level中的 ...
随机推荐
- 关于xml的相关知识
1 xml定义和用途 定义:XML (eXtensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup ...
- 嵌入式Linux系统的构成和启动过程
转自:http://blog.csdn.net/weiganyi/article/details/11561859 在我们的周围,大量的嵌入式设备都是基于Linux系统来构建的,嵌入式Linux与主机 ...
- c++数组传参
最近感觉老是碰到数组传参的问题,特别是二维的数组,每次报错都感觉头疼,烦躁:这里必须总结一下了,先把暂时能解决的问题写在这吧,以便以后碰到查看! 先看一个一维数组传参:这样用数组传参是很不安全的:会输 ...
- Java 平时作业三
自定义一个可以存储 int 类型的集合类(例如:SequenceList),封装一维数组存储数据,该 集合类具有以下方法: (1)新增元素: (2)在指定位置插入一个元素: (3)按位置删除元素: ( ...
- dapper.simplecurd
[Table("Users")]//真实表名 publicclass User { [Key] publicint UserId { get; set; } [Column(&qu ...
- shell练习题4
需求如下: 系统logrotate工具,可以完成日志切割.归档.写一个shell脚本实现类似功能. 举例:假如服务的输出日志是1.log,要求每天归档一个,1.log第二天就变成1.log.1, 第三 ...
- 同一脚本sh 脚本名 报Syntax error: "(" unexpected而./脚本名不报错,求解!!
同一脚本sh 脚本名 执行时报Syntax error: "(" unexpected:而./脚本名执行不报错,为什么呢 脚本内容如下: function usage(){ ech ...
- Intellij idea 2018的注册方式
激活方式:License Server 第一步: 将地址 http://active.chinapyg.com/ 或者 http://idea.toocruel.net 任意一个复制到License ...
- day 22 面向对象 类与对象 名称空间操作
一.面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式. 优点:复杂的问 ...
- mycat练习笔记
学习要趁早,装逼莫等老. 刚刚开始接触到mycat, 当然要学习一下了.拿它来设置 mysql 的读写分离,分库分表,以及集群等. 官网: http://www.mycat.io/ 有详情介绍,有G ...