在Unity3D中的渲染優(yōu)化-Drawcall的概念

Draw Call本身的含義很簡(jiǎn)單,就是CPU調(diào)用圖像編程接口,如OpenGL中的glDrawElements命令或者DirectX中的DrawIndexedPrimitive命令,以命令GPU進(jìn)行渲染的操作。

一個(gè)常見的誤區(qū)是坛掠,Draw Call中造成性能問題的元兇是GPU咪奖,認(rèn)為GPU上的狀態(tài)切換是耗時(shí)的盗忱,其實(shí)不是的,真正“拖后腿”其實(shí)的是CPU羊赵。

在深入理解Draw Call之前趟佃,我們先來看一下CPU和GPU之間的流水線化是怎么實(shí)現(xiàn)的,即它們是如何相互獨(dú)立一起工作的昧捷。

1.CPU和GPU是如何實(shí)現(xiàn)并行工作的闲昭?

如果沒有流水線化,那么CPU需要等到GPU完成上一個(gè)渲染任務(wù)才能再次發(fā)送渲染命令靡挥。但這種方法顯然會(huì)造成效率低下序矩。我們需要讓CPU和GPU可以并行工作。而解決方法就是使用一個(gè)命令緩沖區(qū)(Command Buffer)跋破。

命令緩沖區(qū)包含了一個(gè)命令隊(duì)列贮泞,由CPU向其中添加命令,而由GPU從中讀取命令幔烛,添加和讀取的過程是互相獨(dú)立的。命令緩沖區(qū)使得CPU和GPU可以相互獨(dú)立工作囊蓝。當(dāng)CPU需要渲染一些對(duì)象時(shí)饿悬,它可以向命令緩沖區(qū)中添加命令,而當(dāng)GPU完成了上一次的渲染任務(wù)后聚霜,它就可以從命令隊(duì)列中再取出一個(gè)命令并執(zhí)行它狡恬。

命令緩沖區(qū)中的命令有很多種類,而Draw Call是其中一種蝎宇,其他命令還有改變渲染狀態(tài)等(例如改變使用的著色器弟劲,使用不同的紋理等)

2.為什么Draw Call多了會(huì)影響幀率?

我們先來做一個(gè)實(shí)驗(yàn):請(qǐng)創(chuàng)建10 000個(gè)小文件姥芥,每個(gè)文件的大小為1KB兔乞,然后把它們從一個(gè)文件夾復(fù)制到另一個(gè)文件夾。你會(huì)發(fā)現(xiàn)凉唐,盡管這些文件的空間總和不超過10MB庸追,但要花費(fèi)很長(zhǎng)時(shí)間。現(xiàn)在台囱,我們?cè)賮韯?chuàng)建一個(gè)單獨(dú)的文件淡溯,它的大小是10MB,然后也把它從一個(gè)文件夾復(fù)制到另一個(gè)文件夾簿训。而這次復(fù)制的時(shí)間卻少很多咱娶!這是為什么呢米间?明明它們所包含的內(nèi)容大小是一樣的。原因在于膘侮,每一個(gè)復(fù)制動(dòng)作需要很多額外的操作屈糊,例如分配內(nèi)存、創(chuàng)建各種元數(shù)據(jù)等喻喳。如你所見另玖,這些操作將造成很多額外的性能開銷,如果我們復(fù)制了很多小文件表伦,那么這個(gè)開銷將會(huì)很大谦去。

渲染的過程雖然和上面的實(shí)驗(yàn)有很大不同,但從感性角度上是很類似的蹦哼。在每次調(diào)用Draw Call之前鳄哭,CPU需要向GPU發(fā)送很多內(nèi)容,包括數(shù)據(jù)纲熏、狀態(tài)和命令等妆丘。在這一階段,CPU需要完成很多工作局劲,例如檢查渲染狀態(tài)等勺拣。而一旦CPU完成了這些準(zhǔn)備工作,GPU就可以開始本次的渲染鱼填。GPU的渲染能力是很強(qiáng)的药有,渲染200個(gè)還是2 000個(gè)三角網(wǎng)格通常沒有什么區(qū)別,因此渲染速度往往快于CPU提交命令的速度苹丸。如果Draw Call的數(shù)量太多愤惰,CPU就會(huì)把大量時(shí)間花費(fèi)在提交Draw Call上,造成CPU的過載赘理。

3.如何減少Draw Call宦言?

盡管減少Draw Call的方法有很多,但這里僅討論使用批處理(Batching)的方法商模。

提交大量很小的Draw Call會(huì)造成CPU的性能瓶頸奠旺,即CPU把時(shí)間都花費(fèi)在準(zhǔn)備Draw Call的工作上了。那么施流,一個(gè)很顯然的優(yōu)化想法就是把很多小的DrawCall合并成一個(gè)大的Draw Call凉倚,這就是批處理的思想。

需要注意的是嫂沉,由于我們需要在CPU的內(nèi)存中合并網(wǎng)格稽寒,而合并的過程是需要消耗時(shí)間的。因此趟章,批處理技術(shù)更加適合于那些靜態(tài)的物體杏糙,例如不會(huì)移動(dòng)的大地慎王、石頭等,對(duì)于這些靜態(tài)物體我們只需要合并一次即可宏侍。當(dāng)然赖淤,我們也可以對(duì)動(dòng)態(tài)物體進(jìn)行批處理。但是谅河,由于這些物體是不斷運(yùn)動(dòng)的咱旱,因此每一幀都需要重新進(jìn)行合并然后再發(fā)送給GPU,這對(duì)空間和時(shí)間都會(huì)造成一定的影響绷耍。

在游戲開發(fā)過程中吐限,為了減少Draw Call的開銷,有兩點(diǎn)需要注意褂始。

(1)避免使用大量很小的網(wǎng)格诸典。當(dāng)不可避免地需要使用很小的網(wǎng)格結(jié)構(gòu)時(shí),考慮是否可以合并它們崎苗。

(2)避免使用過多的材質(zhì)狐粱。盡量在不同的網(wǎng)格之間共用同一個(gè)材質(zhì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胆数,一起剝皮案震驚了整個(gè)濱河市肌蜻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌必尼,老刑警劉巖蒋搜,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胰伍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酸休,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門骂租,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斑司,你說我怎么就攤上這事渗饮。” “怎么了宿刮?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵互站,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我僵缺,道長(zhǎng)胡桃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任磕潮,我火速辦了婚禮翠胰,結(jié)果婚禮上容贝,老公的妹妹穿的比我還像新娘。我一直安慰自己之景,他們只是感情好斤富,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锻狗,像睡著了一般满力。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轻纪,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天油额,我揣著相機(jī)與錄音,去河邊找鬼桐磁。 笑死悔耘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的我擂。 我是一名探鬼主播衬以,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼校摩!你這毒婦竟也來了看峻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤衙吩,失蹤者是張志新(化名)和其女友劉穎互妓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坤塞,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冯勉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摹芙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灼狰。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浮禾,靈堂內(nèi)的尸體忽然破棺而出交胚,到底是詐尸還是另有隱情,我是刑警寧澤盈电,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布蝴簇,位于F島的核電站,受9級(jí)特大地震影響匆帚,放射性物質(zhì)發(fā)生泄漏熬词。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一吸重、第九天 我趴在偏房一處隱蔽的房頂上張望荡澎。 院中可真熱鬧均践,春花似錦、人聲如沸摩幔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽或衡。三九已至焦影,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間封断,已是汗流浹背斯辰。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坡疼,地道東北人彬呻。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柄瑰,于是被迫代替她去往敵國(guó)和親闸氮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容