unity--優(yōu)化CPU之DrawCall

前言

      CPU準(zhǔn)備數(shù)據(jù)并通知GPU渲染的過(guò)程就是一次DrawCall,如果這個(gè)過(guò)程出現(xiàn)的次數(shù)太多,就會(huì)影響CPU的執(zhí)行效率,就會(huì)出現(xiàn)卡頓汗捡。
      當(dāng)然沟涨,影響CPU的不僅僅只有DrawCall,還有物理組件虐秦、GC(垃圾對(duì)象太多,造成GC負(fù)擔(dān)断凶,影響CPU的執(zhí)行效率)、代碼質(zhì)量巫俺。

官方鏈接點(diǎn)這里


Draw Call Batching

在屏幕上繪制一個(gè)物體认烁,U3D引擎必須向繪圖API(openGL或者D3D)發(fā)起一次DrawCall。
這些DrawCall往往是昂貴的,當(dāng)繪圖API為每個(gè)DrawCall做一些重要的事情却嗡,引起GPU的性能消耗較高舶沛。
這些消耗大部分是因?yàn)镈rawCall結(jié)束的狀態(tài)切換引起的(比如,從一個(gè)材質(zhì)切換到另一個(gè)材質(zhì))窗价,因?yàn)檫@會(huì)引發(fā)昂貴顯卡驅(qū)動(dòng)的驗(yàn)證和變換步驟如庭。

Unity使用多種技術(shù)來(lái)解決這個(gè)問(wèn)題:
靜態(tài)Batching:把靜態(tài)的物體合并成一個(gè)大meshes,然后用更快的方法渲染他們撼港。
動(dòng)態(tài)Batching:對(duì)于足夠小的meshes坪它,在CPU上變換他們的頂點(diǎn),將一些相似的組合到一起帝牡,在一次中繪制往毡。

內(nèi)建的Baching相對(duì)于手動(dòng)合并物體到一起有幾個(gè)好處(值得注意的是,這些對(duì)象仍可以被單獨(dú)銷毀)否灾。
但是他也有它的缺點(diǎn)(靜態(tài)Batching會(huì)導(dǎo)致內(nèi)存和存儲(chǔ)的開(kāi)銷卖擅,動(dòng)態(tài)Batching會(huì)導(dǎo)致CPU開(kāi)銷)。


Material Setup For Batching(合并材質(zhì))

只有共享同一個(gè)材質(zhì)的物體才能被Batched在一起墨技。如果惩阶,你想達(dá)到一個(gè)好的batching,你需要竟可能多的在不同物體中共享材質(zhì)扣汪。
如果你有兩個(gè)同樣的材質(zhì)但是他們的textures不同断楷,你可以合并這些textures到一個(gè)大texture - 這個(gè)過(guò)程經(jīng)常被叫做texture atlasing。
一旦textures在同一個(gè)圖集中崭别,你就可以使用一個(gè)材質(zhì)來(lái)代替了冬筒。
如果你需要在腳本中訪問(wèn)共享了的材質(zhì),有一個(gè)很重的點(diǎn)需要注意:修改Renderer.material屬性會(huì)創(chuàng)建一個(gè)當(dāng)前材質(zhì)的副本茅主。
所以舞痰,作為替換方案,你應(yīng)該使用Rednerer.sharedMaterial以保證材質(zhì)被共享诀姚。
當(dāng)渲染陰影投射的時(shí)候响牛,即使他們的材質(zhì)是不同的,也經(jīng)常被batched到一起赫段。
只要材質(zhì)中的數(shù)值在shadow pass是相同的呀打,即使陰影投射有不同的材質(zhì),他們也可以使用動(dòng)態(tài)batching糯笙。
舉個(gè)例子贬丛,許多箱可以使用具有不同的texture的材質(zhì),但對(duì)于陰影投射渲染 texture是不相關(guān) - 在這種情況下给涕,他們可以被batched到在一起豺憔。


Dynamic Batching(動(dòng)態(tài)批處理)

Unity可以自動(dòng)batch移動(dòng)物體到相同的draw call额获,如果它們具有相同的材質(zhì)和滿足其它標(biāo)準(zhǔn)。動(dòng)態(tài)Batching是自動(dòng)完成的焕阿,不需要你做額外的事情咪啡。
Batching 動(dòng)態(tài)的物體每個(gè)頂點(diǎn)會(huì)有某些開(kāi)銷,所以batching只適用于頂點(diǎn)數(shù)小于900的meshes暮屡。如果你得shader使用了頂點(diǎn)位置撤摸,法線和單獨(dú)的UV,那么你可以batch 300 個(gè)頂點(diǎn);如果你得shader使用了頂點(diǎn)位置褒纲,法線准夷,UV0,UV1莺掠,和正切衫嵌,只能batch 180個(gè)頂點(diǎn)

這個(gè)限制的數(shù)量將來(lái)有可能會(huì)變化彻秆。

其它限制

  1. 如果物體包含鏡像變換楔绞,他們將不會(huì)被batched,例如唇兑,object A 的scale 為 +1 object B 的scale 為-1酒朵,就不能batched到一起。
  2. 使用不同材質(zhì)的實(shí)例扎附,即使他們實(shí)質(zhì)上是相同的蔫耽,也會(huì)導(dǎo)致兩個(gè)物體不能被batched到一起。陰影投射除外留夜。
  3. 具有光照貼圖的對(duì)象有額外的渲染參數(shù):光照索引和 偏移/放縮 的光照匙铡。所以一般動(dòng)態(tài)lightmapped對(duì)象應(yīng)指向完全相同的光照貼圖位置然后再進(jìn)行batch。
  4. 多通道的shader將不會(huì)被batching幾乎所有的Unity shader都支持前置渲染幾個(gè)燈光碍粥,有效的為他們做更多的通道鳖眼。“額外的逐像素的燈光”的draw call 將不會(huì)被batched嚼摩。
  5. 傳統(tǒng)的延遲渲(逐通道光照)染通道禁用了動(dòng)態(tài)batching钦讳,因?yàn)樗仨毨L制兩次。

由于它的工作原理是變換所有的物體的頂點(diǎn)到CPU的世界坐標(biāo)中低斋,所以它僅僅在它的工作(變換到cpu的世界坐標(biāo))比做一次“draw call”小的時(shí)候才能起到好的作用。
究竟一個(gè)DrawCall有多昂貴取決于諸多因素匪凡,主要是所用的繪圖API膊畴。例如,在控制臺(tái)或當(dāng)前流 行的APIs例如Apple Metal DrawCall的開(kāi)銷一般比較低病游,所以一般動(dòng)態(tài)batching不會(huì)達(dá)到好的效果唇跨。


Static Batching(靜態(tài)批處理)

靜態(tài)batching允許引擎減少draw call適用于任何大小的幾何對(duì)象(假設(shè)沒(méi)有移動(dòng)和共享材質(zhì))稠通。大部分情況下他比動(dòng)態(tài)batching更高效 ,但是它會(huì)占用更多的內(nèi)存买猖。
為了使靜態(tài)batching更好的獲益改橘,你需要明確的指定游戲中某些物體是靜態(tài)的而且不會(huì)移動(dòng),旋轉(zhuǎn)或者縮放玉控。這樣做飞主,你可以在Inspector界面中的“Static”選項(xiàng)(chekbox)標(biāo)記物體為static

使用靜態(tài)batching將需要額外的內(nèi)存來(lái)存儲(chǔ)合并后的幾何信息。如果幾個(gè)物體在靜態(tài)batching之前共享同一個(gè)幾何圖元高诺,那么這個(gè)幾何圖元將會(huì)為每個(gè)物體復(fù)制一份碌识,無(wú)論在Editor中還是runtime中都是如此。這不是一個(gè)好方法 - 有時(shí)候?yàn)榱吮3指〉膬?nèi)存占用量虱而,你必須犧牲渲染性能為了避免一些物體的靜態(tài)batching筏餐。例如,在一個(gè)稠密的森林中牡拇,標(biāo)記樹木為static會(huì)產(chǎn)生嚴(yán)重的內(nèi)存影響魁瞪。
在內(nèi)部,靜態(tài)batching的原理是變換這些靜態(tài)物體到世界控件然后為他們建立一個(gè)很大頂點(diǎn)+索引 緩沖區(qū)惠呼。然后所有顯示的物體都放到一個(gè)batch导俘,一系列“便宜的”draw call就完成了,這期間幾乎沒(méi)有狀態(tài)切換(state change)罢杉。所以 從技術(shù)上來(lái)講 這并沒(méi)有節(jié)省“3D API draw call”趟畏,但是他節(jié)省了他們之間的狀態(tài)切換(狀態(tài)切換才是罪魁禍?zhǔn)祝?/p>


Other Batching Related Tips

目前,只有網(wǎng)格渲染才被batched滩租。像 skinned meshes赋秀,cloth,拖尾渲染器(Trail Renderer)和其他類型的渲染組件是不被batched的律想。
半透明shader為了做透明度的工作猎莲,經(jīng)常需要物體以從后到前的順序進(jìn)行渲染。
Unity首先會(huì)對(duì)物體進(jìn)行排序技即,然后試著batch他們 - 因?yàn)檫@個(gè)順序是嚴(yán)格限制的著洼,這就意味著 相對(duì)于不透明物體來(lái)說(shuō),會(huì)有很少的batching產(chǎn)生而叼。
相對(duì)調(diào)用draw call來(lái)說(shuō)身笤,手動(dòng)合并比較近的物體可能是一個(gè)非常不錯(cuò)的選擇。
例如葵陵,許多抽屜的靜態(tài)柜子合并成一個(gè)mesh經(jīng)常是有道理的液荸,無(wú)論是在3D建模軟件中還是使用Mesh.CombineMeshaes.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脱篙,隨后出現(xiàn)的幾起案子娇钱,更是在濱河造成了極大的恐慌伤柄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件文搂,死亡現(xiàn)場(chǎng)離奇詭異适刀,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)煤蹭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門笔喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人疯兼,你說(shuō)我怎么就攤上這事然遏。” “怎么了吧彪?”我有些...
    開(kāi)封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵待侵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我姨裸,道長(zhǎng)秧倾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任傀缩,我火速辦了婚禮那先,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赡艰。我一直安慰自己售淡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布慷垮。 她就那樣靜靜地躺著揖闸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪料身。 梳的紋絲不亂的頭發(fā)上汤纸,一...
    開(kāi)封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音芹血,去河邊找鬼贮泞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幔烛,可吹牛的內(nèi)容都是我干的啃擦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼饿悬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼令蛉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乡恕,我...
    開(kāi)封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤言询,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后傲宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體运杭,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年函卒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辆憔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡报嵌,死狀恐怖虱咧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锚国,我是刑警寧澤腕巡,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站血筑,受9級(jí)特大地震影響绘沉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豺总,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一车伞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喻喳,春花似錦另玖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绑榴,卻和暖如春哪轿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翔怎。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工窃诉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赤套。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓飘痛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親容握。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宣脉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • 原文地址 http://www.fx114.net/qa-75-172454.aspx 使用Profiler工具...
    IongX閱讀 5,835評(píng)論 1 11
  • 0x00 前言 剛開(kāi)始寫這篇文章的時(shí)候選了一個(gè)很土的題目。剔氏。塑猖≈竦唬《Unity3D優(yōu)化全解析》。因?yàn)檫@是一篇臨時(shí)起意才...
    楊夏MX閱讀 2,317評(píng)論 2 11
  • 提Unity3D項(xiàng)目?jī)?yōu)化則必提DrawCall羊苟,這自然沒(méi)錯(cuò)塑陵,但也有很不好影響。因?yàn)檫@會(huì)給人一個(gè)錯(cuò)誤的認(rèn)識(shí):所...
    JumboWu閱讀 3,266評(píng)論 0 12
  • 我的夢(mèng)想有過(guò)很多蜡励。小時(shí)候夢(mèng)想著當(dāng)科學(xué)家令花,初中時(shí)因?yàn)榈乩韺W(xué)的非常好,立志當(dāng)?shù)乩韺W(xué)家和周游世界凉倚。后來(lái)兼都,夢(mèng)想變了又變,想...
    lemonnade閱讀 278評(píng)論 0 0
  • 文l張西影 "哥! 這小天知道應(yīng)該去哪耍嘛?" "不知道! " "哥! 你真的不懂還是在裝蒜?三月觀花揚(yáng)州地啊!...
    豫視西影閱讀 432評(píng)論 0 0