(转)Unity_什么是Draw Call? 什么是Batch?

时间:2022-09-23 13:24:00

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

(转)Unity_什么是Draw Call? 什么是Batch?
 

首先,讓我們定義何為 “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:

(转)Unity_什么是Draw Call? 什么是Batch?
 

舉個例子:如果你的目標是遊戲跑30FPS、使用2GHz的CPU、20%的工作量撥給Draw Call來使用,那你每秒可以有多少Draw Call呢?

333 Batchs/Frame = 25K * 2 * (0.2/30)

那既然 Batch 是個箱子,裡頭裝著物件的頂點資料,再依據我們上面的描述,那表示同樣材質或 Shader 的物件,可以合併成一個 Batch 送往 GPU,這樣就是最省事的方法搂?BINGO!就是這樣沒錯!

UNITY 在 Player Setting 裡的兩個功能選項 Static Batching 與 Dynamic Batching。功能描述如下:

  1. Static Batching 是將標明為 Static 的靜態物件,如果在使用相同材質球的條件下,UNITY 會自動幫你把這兩個物件合併成一個 Batch,送往 GPU 來處理。這功能對效能上非常的有幫助,所以是需要付費才有的。
  2. Dynamic Batching 是在物件小於300面的條件下(不論物件是否為靜態或動態),在使用相同材質球下,UNITY就會自動幫你合併成一個 Batch 送往 GPU 來處理。

底下是另一篇對岸高手寫的相關文章,以及 NVIDIA 在 GDC 曾經探討的一個Topic,三篇一起服用效果更佳:

(转)Unity_什么是Draw Call? 什么是Batch?的更多相关文章

  1. 圆角矩形shader

    在游戏中,有时需要对一张矩形图片进行切割,绘制成圆角矩形. circelrect.vert attribute vec4 a_position; attribute vec4 a_normal; at ...

  2. libgdx学习记录19——图片动态打包PixmapPacker

    libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题 ...

  3. libgdx学习记录17——照相机Camera

    照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. C ...

  4. libgdx学习记录1——图片显示Texture

    libgdx底层采用opengl渲染,对图片进行了优化处理,与android原生态的bitmap不太一样. 相比而言,效率要高一些,不过只支持png,jpg,bmp三种格式. 显示中,一般将图片放在a ...

  5. libgdx 环境搭建

    1:环境搭建: (1)首先进入官网,http://libgdx.badlogicgames.com/download.html  点击下方的Releases.进行下载最新的版本号就可以. 这个为我们开 ...

  6. Libgdx window add alpha action change the background actor alpha

    现象: Stage中包括一个Window,一个Actor,Window中加入alpha action后,Actor也随之消失:Actor加入alpha action后,不起作用. 解决: 重写draw ...

  7. [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader

    高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...

  8. [libgdx游戏开发教程]使用Libgdx进行游戏开发(6)-添加主角和道具

    如前所述,我们的主角是兔子头.接下来我们实现它. 首先对AbstractGameObject添加变量并初始化: public Vector2 velocity; public Vector2 term ...

  9. [libGDX游戏开发教程]使用Libgdx进行游戏开发(5)-关卡加载

    在上一章我们介绍了如何管理和利用素材,但是我们注意到,这些素材都是零散的,比如岩石的左部等,这一章,我们将利用这些零件拼合成完整的游戏对象. 回顾最开始的设计类图,注意Level类和所有Level中的 ...

随机推荐

  1. PHP 获取指定目录下所有文件(包含子目录)

    PHP 获取指定目录下所有文件(包含子目录) //glob — 寻找与模式匹配的文件路径 $filter_dir = array('CVS', 'templates_c', 'log', 'img', ...

  2. 安装和使用的django的debug_toolbar

    安装和使用的django的debug_toolbar Django Debug Toolbar安装 安装Django Debug Toolbar pip install django-debug-to ...

  3. 【转】CentOS图形界面的开启与关闭

    源自:http://blog.sina.com.cn/s/blog_4a1f76860100zpus.html 安装CentOS 5.6系统的时候我没有先装任何组件,现在用X Window,需要再安装 ...

  4. IdentityServer4 指定角色授权(Authorize(Roles="admin"))

    1. 业务场景 IdentityServer4 授权配置Client中的AllowedScopes,设置的是具体的 API 站点名字,也就是使用方设置的ApiName,示例代码: //授权中心配置 n ...

  5. mybatis逆向工程没有报错,但是也没有pojo和Mapper文件问题

    如果你使用的逆向工程是自己手写上去的配置文件,那么错误的范围就太大了.如果是你导入以前使用过的逆向工程,那么没有生成文件很可能是使用的操作系统不同. 原因:逆向工程中的路径问题,windows和mac ...

  6. 解决.Net Mvc跨域请求问题

    针对ASP.NET MVC和ASP.NET Web API两种项目类型 1.针对ASP.NET MVC,只需要在web.config中添加如下的内容即可 <system.webServer&gt ...

  7. CSS3之transition&amp&semi;transform

    参考网页: CSS3 transform 属性使用详解: http://www.renniaofei.com/code/css3-transform-shuxing-shiyong-xiangjie/ ...

  8. 关于latex的网站推荐

    有时候,你不知道某个数学符号的tex写法是什么,可以在下面这个网站手写该符号,然后会出现很多候选. http://detexify.kirelabs.org/classify.html 用latex处 ...

  9. iredmail邮件服务器之修改默认的web服务端口号

    安装iredmail之后,由于需要在路由器上做端口映射以便在外网访问webmail,因此端口不能和WEB服务的端口好冲突,所以需要修改邮件服务器的httpd服务的端口. 一.apache/httpd的 ...

  10. 糗事之 -- 用ssh公钥实现免密码登录

    前言:工作原因,每天都会登录好多次服务器,每次都是ssh root@192.168..... 然后输入密码,来来回回输几次真是很烦啊. 问题:怎么可以在每次ssh连接服务器时不用输入密码,直接登录? ...