Unity Shader優(yōu)化

(1)? ?用step()代替if else等條件語(yǔ)句:(edge=step(edge,_Edge);表示if(edge<=_Edge) edge=1 , else edge=0)

在片段著色器中将硝,以正常CPU編程的邏輯進(jìn)行優(yōu)化恭朗,例如,if(edge < _EdgeColor){return _EdgeColor;},如果此像素被判定為邊緣依疼,則直接返回邊緣顏色痰腮,那么則不用再進(jìn)行之后的運(yùn)算了。但這種優(yōu)化對(duì)于GPU編程來(lái)講是無(wú)效的律罢。再片段著色器中膀值,每個(gè)片段著色器每條指令操作上百個(gè)像素,如果有些片段采取一個(gè)分支而有些片段不采用另一個(gè)分支误辑,則所有片段都會(huì)執(zhí)行兩個(gè)分支沧踏,但只在每個(gè)片段應(yīng)該采取的分之上寫入寄存器。另外巾钉,if/endif等流程控制操作有較高的開銷(4個(gè)時(shí)鐘周期翘狱,Gefirce6系列(Nvidia))。因此在GPU編程中砰苍,ifelse,switchcase等條件語(yǔ)句和太復(fù)雜的邏輯是不推薦的潦匈。相應(yīng)的可以用階梯函數(shù)step()等函數(shù)進(jìn)行替換,這樣所有的線程都執(zhí)行完全一樣的代碼师骗。

(2)Shader資源解析優(yōu)化。一般來(lái)說(shuō)讨惩,一個(gè)Shader資源的物理Size僅幾KB辟癌,在內(nèi)存中也不過(guò)幾十KB。所以荐捻,Shader資源的效率加載瓶頸并不在其自身大小的加載上黍少,而是在Shader內(nèi)容的解析上。一般情況下处面,Shader加載的CPU耗時(shí)與其Keyword數(shù)量有關(guān)厂置,Keyword數(shù)量越多,則加載開銷也越大魂角。Shader的Keyword數(shù)量是會(huì)隨著場(chǎng)景設(shè)置的不同而變化的昵济。(注意:在Unity 5.x中,Unity默認(rèn)會(huì)根據(jù)場(chǎng)景設(shè)置野揪、Shader

Pass等來(lái)調(diào)整Shader的Keyword访忿,比如如果存在Lightmap的使用,則會(huì)默認(rèn)將對(duì)應(yīng)的Keyword打開斯稳,而對(duì)于沒(méi)有使用Fog的項(xiàng)目海铆,則會(huì)直接將相關(guān)Keyword關(guān)閉。)減少Keyword可以嘗試以下方法:

盡量減少shader_feature和#pragma multi_compile等關(guān)鍵字挣惰,減小解析耗時(shí)卧斟,同時(shí)減少shader varaints(shader變體)數(shù)量殴边,從而減少內(nèi)存占用。

通過(guò)skip_variants操作在Shader中直接去除相關(guān)Keyword,使用示例如下:


直接去除Shader中的Fallback選項(xiàng)珍语。對(duì)于使用Mobile Shader的項(xiàng)目锤岸,可以嘗試直接將其Fallback去掉大幅降低keyword數(shù)量。

使用AssetBundle方式加載資源廊酣,為避免大量相同的Shader被重復(fù)加載和卸載能耻,可采用以下加載方式:通過(guò)依賴關(guān)系打包,將項(xiàng)目中的所有Shader抽離并打成一個(gè)獨(dú)立的AssetBundle文件亡驰,其它AssetBundle與其建立依賴晓猛。Shader的AssetBundle文件在游戲啟動(dòng)后即進(jìn)行加載并常駐內(nèi)存,因?yàn)橐豢铐?xiàng)目的Shader種類數(shù)量一般在50~100不等凡辱,且每個(gè)均很小戒职,即便全部常駐內(nèi)存,其內(nèi)存總占用量也不會(huì)超過(guò)2MB透乾;后續(xù)Prefab加載和實(shí)例化后洪燥,Unity引擎會(huì)通過(guò)AssetBundle之間的依賴關(guān)系直接找到對(duì)應(yīng)的Shader資源進(jìn)行使用,而不會(huì)再進(jìn)行加載和解析操作乳乌。(注意:對(duì)于Unity4.x版本捧韵,Shader的AssetBundle加載后只需LoadAll即可完成所有Shader的加載和解析,但對(duì)于Unity5.x版本汉操,除執(zhí)行LoadAllAssets操作外再来,還需要進(jìn)行Shader.WarmupAllShaders操作(因?yàn)樵赨nity5.x版本中,Shader的解析和CreateGPUProgram操作是分離的)磷瘤,保證實(shí)際需要的Shader variants被完全加載芒篷,避免游戲過(guò)程中編譯Shader導(dǎo)致的hiccups(卡頓)。新的Unity版本中已由ShaderVariantCollection.WarmUp()代替Shader.WarmupAllShaders操作采缚。)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末针炉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扳抽,更是在濱河造成了極大的恐慌篡帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贸呢,死亡現(xiàn)場(chǎng)離奇詭異赂苗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贮尉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門拌滋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人猜谚,你說(shuō)我怎么就攤上這事败砂《脑” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵昌犹,是天一觀的道長(zhǎng)坚芜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)斜姥,這世上最難降的妖魔是什么鸿竖? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮铸敏,結(jié)果婚禮上缚忧,老公的妹妹穿的比我還像新娘。我一直安慰自己杈笔,他們只是感情好闪水,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒙具,像睡著了一般球榆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上禁筏,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天持钉,我揣著相機(jī)與錄音,去河邊找鬼篱昔。 笑死每强,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旱爆。 我是一名探鬼主播舀射,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼窘茁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怀伦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起山林,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤房待,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后驼抹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桑孩,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年框冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了流椒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡明也,死狀恐怖宣虾,靈堂內(nèi)的尸體忽然破棺而出惯裕,到底是詐尸還是另有隱情,我是刑警寧澤绣硝,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布蜻势,位于F島的核電站,受9級(jí)特大地震影響鹉胖,放射性物質(zhì)發(fā)生泄漏握玛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一甫菠、第九天 我趴在偏房一處隱蔽的房頂上張望挠铲。 院中可真熱鬧,春花似錦淑蔚、人聲如沸市殷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)醋寝。三九已至,卻和暖如春带迟,著一層夾襖步出監(jiān)牢的瞬間音羞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工仓犬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗅绰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓搀继,卻偏偏與公主長(zhǎng)得像窘面,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叽躯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • 翻譯:莫銘原文地址:AssetBundle usage patterns 本系列中的上一篇文章覆蓋了AssetBu...
    莫銘閱讀 5,235評(píng)論 1 12
  • 原文地址:http://gad.qq.com/article/detail/7180936作者:Loki+XUni...
    重裝機(jī)霸閱讀 8,192評(píng)論 0 41
  • Unity3D 里有兩種動(dòng)態(tài)加載機(jī)制:一個(gè)是Resources.Load财边,另外一個(gè)通過(guò)AssetBundle,其實(shí)...
    IongX閱讀 1,725評(píng)論 0 5
  • 我看了一會(huì)兒書,覺(jué)得無(wú)聊点骑,出來(lái)摘院子里的青蘋果吃酣难,酸得牙根疼,就泡了他的茶喝黑滴。茶只有半盒茶憨募,形狀小小的,似乎有著白...
    紫微媽咪閱讀 152評(píng)論 0 1
  • 初夏的季節(jié)袁辈,多了些雨水菜谣。天氣預(yù)報(bào)說(shuō)今天是陰天,是出去玩的好天氣,我們決定帶上老媽去趟汾河二庫(kù)尾膊。 這個(gè)地方...
    風(fēng)逸云淡閱讀 195評(píng)論 0 1