開發遊戲時,一定被時時提醒要減少 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. 白鹭wing的自动编译

    1.lunch.json文件中的"preLaunchTask":"build",注释掉. 2.安装node-v6.11.2-x64.msi 3.安装tsc 命令 ...

  2. Win7下“回收站已损坏,是否清空该驱动器上的回收站”解决方法

    最近买的移动硬盘,总是不能进行安全删除,有事还会提示“回收站已损坏,是否清空该驱动器上的回收站”,可以通过下面的命令进行解决: 开始–>运行–>cmd 点确定 在cmd窗口输入rd /s ...

  3. Javase系列之面向对象(一)

    作为一个Java程序员,我们每天做的事情就是OOP(面向对象),可以说万物皆对象,Java是一门面向对象的程序语言,鉴于基本的面向对象知识也是一个较为庞杂的模块,所以博主我准备用多篇文章去介绍Java ...

  4. ASP.NET 性能监控工具和优化技巧

    转载自:http://blog.haoitsoft.com/index.php/archives/657 ASP.NET 性能监控工具和优化技巧 发表回复 为了阐明准确甄别性能问题的重要性,下面列举了 ...

  5. pdf.js使用总结#如何在网页读取并显示PDF格式文档

    pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件 pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,一个负责API解析,一个负责核 ...

  6. Excel修改证件照图片背景色

    在实际生活中,我们常常需要把白底证件照更改为蓝底或红底.操作步骤只需4步!   工具/原料   Excel 方法/步骤     第1步:插入白底证件照 单击[插入]---[图片],选择图片保存的位置, ...

  7. Oracle学习DaySix(PL/SQL续)

    一.游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现.游标是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上 下文区会发生些 ...

  8. jenkins部署安装

    http://www.cnblogs.com/lzcys8868/p/6286727.html

  9. Matlab小波工具箱的使用2

    Matlab小波工具箱的使用2 (2011-11-11 09:32:57) 转载▼ http://blog.sina.com.cn/s/blog_6163bdeb0102dw7a.html#cmt_5 ...

  10. RabbitMQ集群出现过机器故障,网络异常等故障后,重启无法重新建立集群的终极解决方案

    由于机器掉电,网络故障等原因,RabbitMQ整个集群出现问题.重启RabbitMQ时,发现某些机器始终无法重新加入到集群中,而且还可能出现网络分区. 针对不同情况,可能选择 rabbitmqctl ...