開發遊戲時,一定被時時提醒要減少 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呢?

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. React中this.setState是同步还是异步?为什么要设计成异步?

    在使用react的时候,this.setState为什么是异步呢? 一直以来没有深思这个问题.昨天就此问题搜索了一下. react创始人之一 Dan Abramovgaearon在GitHub上回答了 ...

  2. JAVA第2课

         JAVA   第二课 Eclipse 在加载JAVA环境出错的时候处理办法: 项目-属性-Java build path-add library -JRE system library-OK ...

  3. xcode的打包上线出问题:导入此构建版本时出错

    原因:升级mac系统到了High sierra(10.13,目前还是测试版,并没有正式版,全新的文件系统 APFS (Apple File System))发现没有这个问题,于是乎,所以给出这种解决方 ...

  4. LR单用户,重复操作日志

    案例:假如你想在一个脚本中,实现登录执行1次,查询执行2次,插入执行3次,怎么办?录3个脚本?每个事务分别在脚本中复制N次? 当然不用,LR早就想到了你的需求,下面让我们隆重推出Block. 位置: ...

  5. Zynq系列程序逻辑固化方法

    1.创建一个BOOT镜像 该小节主要讲述zynq平台利用软件套件SDK创建一个可固化BOOT镜像. 1.1  选择Ad9361_Eque1工程,选择Xilinx Tools → Create Boot ...

  6. python安装后环境变量的设置

    win7系统中单击右击计算机->属性->高级系统设置->环境变量 在path目录下用分号分开做分割添加环境变量. 如果同时添加python2.x.x版本和python3.x.x版本两 ...

  7. 树莓派外网ssh访问holer实现篇

    外网ssh访问树莓派 内网的树莓派(Raspberry Pi),只能在局域网内访问,怎样从公网也能ssh登录访问树莓派? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安装并启动树 ...

  8. task打印执行结果

    使用debug输出task执行的register: - name: check extract session # script: /app/ansiblecfg/XXX/roles/test/tas ...

  9. WebStorm 安装及使用

    WebStrom 插件安装 File(文件) -> settings(设置) -> Plugins 即可调出设置中的插件选项. 或者 按 快捷键ctrl + alt + s也可调出设置菜单 ...

  10. python--sort()和sorted()高级排序

    1.list中的sort()方法: def sort(self, key=None, reverse=False): # real signature unknown; restored from _ ...