国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Shader 優(yōu)化相關(guān)資料整理

2019-11-14 11:47:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

編寫(xiě)shader時(shí)的一些建議

轉(zhuǎn)自:http://www.survivalescaperooms.com/sifenkesi/p/4716791.html

1、只計(jì)算需要計(jì)算的東西

盡量減少無(wú)用的頂點(diǎn)數(shù)據(jù), 比如貼圖坐標(biāo), 如果有Object使用2組有的使用1組, 那么不 要將他們放在一個(gè)vertex buffer中, 這樣可以減少傳輸?shù)臄?shù)據(jù)量;避免過(guò)多的頂點(diǎn)計(jì)算,比如過(guò)多的光源, 過(guò)于復(fù)雜的光照計(jì)算(復(fù)雜的光照模型);避免 VS 指令數(shù)量太多或者分支過(guò)多, 盡量減少 VS 的長(zhǎng)度和復(fù)雜程度;

2、盡量在 VS 總計(jì)算

通常,需要渲染的像素比頂點(diǎn)數(shù)多,而頂點(diǎn)數(shù)又比物體數(shù)多很多。所以如果可以,盡量將運(yùn)算從 FS 移到 VS,或直接通過(guò) script 來(lái)設(shè)置某些固定值;

3、指令優(yōu)化【Unity】

在使用Surface Shader時(shí),可以通過(guò)一些指令讓shader優(yōu)化很多。

  通常情況下,Surface shader的很多默認(rèn)選項(xiàng)都是開(kāi)啟的,以適應(yīng)大多數(shù)情況,但是很多時(shí)候,你可以關(guān)閉其中的一些選項(xiàng),從而讓你的shader運(yùn)行的更快:  (1) apPRoxview 對(duì)于使用了 view direction 的shader,該選項(xiàng)會(huì)讓 view dir 的 normalize 操作 per-vertex 進(jìn)行,而不是 per-pixel。這個(gè)優(yōu)化通常效果明顯。  (2) halfasview 可以讓Specular shader變得快一些,使用一個(gè)介于光照方向和觀察方向之間的 half vector 來(lái)代替真正的觀察方向 viewDir 來(lái)計(jì)算光照函數(shù)。  (3) noforwardadd Forward Rende r時(shí),完全只支持一盞方向光的 per-pixel 渲染,其余的光照全部按照 per-vertex 或 SH 渲染。這樣可以確保shader在一個(gè)pass里渲染完成。  (4) noambient 禁掉 ambient lighting 和 SH lighting,可以讓 shader 快一點(diǎn)兒。

4、浮點(diǎn)數(shù)精度相關(guān):

  float:最高精度,通常32位  half:中等精度,通常16位,-60000到60000,  fixed:最低精度,通常11位,-2.0到2.0,1/256的精度。  盡量使用低精度。對(duì)于 color 和 unit length vectors,使用fixed,其他情況,根據(jù)取值范圍盡量使用 half,實(shí)在不夠則使用 float 。  在移動(dòng)平臺(tái),關(guān)鍵是在 FS 中盡可能多的使用低精度數(shù)據(jù)。另外,對(duì)于多數(shù)移動(dòng)GPU,在低精度和高精度之間轉(zhuǎn)換是非常耗的,在fixed上做swizzle操作也是很費(fèi)事的。

5、Alpha Test

  Alpha test 和 clip() 函數(shù),在不同平臺(tái)有不同的性能開(kāi)銷。  通常使用它來(lái)剔除那些完全透明的像素。  但是,在 iOS 和一些 Android 上使用的 PowerVR GPUs上面,alpha test非常的昂貴。

6、Color Mask

  在移動(dòng)設(shè)備上,Color Mask 也是非常昂貴的,所以盡量別使用它,除非真的是需要。

shader中用for,if等條件語(yǔ)句為什么會(huì)使得幀率降低很多?

作者:空明流轉(zhuǎn)鏈接:https://www.zhihu.com/question/27084107/answer/39281771來(lái)源:知乎著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)。

1. For和If不一定意味著動(dòng)態(tài)分支

在GPU上的分支語(yǔ)句(for,if-else,while),可以分為三類。Branch的Condition僅依賴編譯期常數(shù)此時(shí)編譯器可以直接攤平分支,或者展開(kāi)(unloop)。對(duì)于For來(lái)說(shuō),會(huì)有個(gè)權(quán)衡,如果For的次數(shù)特別多,或者body內(nèi)的代碼特別長(zhǎng),可能就不展開(kāi)了,因?yàn)闀?huì)指令裝載也是有限或者有耗費(fèi)的額外成本可以忽略不計(jì)Branch的Condition僅依賴編譯期常數(shù)和Uniform變量一個(gè)運(yùn)行期固定的跳轉(zhuǎn)語(yǔ)句,可預(yù)測(cè)同一個(gè)Warp內(nèi)所有micro thread均執(zhí)行相同分支額外成本很低Branch 的 Condition 是動(dòng)態(tài)的表達(dá)式這才是真正的“動(dòng)態(tài)分支”會(huì)存在一個(gè)Warp的 Micro Thread 之間各自需要走不同分支的問(wèn)題

2. 跳轉(zhuǎn)本身的成本非常低

隨著IP/EP(Instruction Pointer/Execution Pointer)的引入,現(xiàn)代GPU在執(zhí)行指令上的行為,和CPU沒(méi)什么兩樣。跳轉(zhuǎn)僅僅是重新設(shè)置一個(gè)寄存器。

3.Micro Thread 走不同分支時(shí)的處理

GPU本身的執(zhí)行速度快,是因?yàn)樗粭l指令可以處理多個(gè) Micro Thread 的數(shù)據(jù)(SIMD)。但是這需要多個(gè) Micro Thread 同一時(shí)刻的指令是相同的。如果不同,現(xiàn)代GPU通常的處理方法是,按照每個(gè)Micro Thread的不同需求多次執(zhí)行分支。
x = tex.Load();if(x == 5){    // Thread 1 & 2 使用這個(gè)路徑   out.Color = float4(1, 1, 1, 1); }else{    // Thread 3 & 4 使用這個(gè)路徑   out.Color = float4(0, 0, 0, 0);}比如在上例中,兩個(gè)分支的語(yǔ)句Shader Unit都會(huì)執(zhí)行,只是不同的是如果在執(zhí)行if分支,那么計(jì)算結(jié)果將不會(huì)寫(xiě)入到thread 3 和 4的存儲(chǔ)中(無(wú)副作用)。這樣做就相當(dāng)于運(yùn)算量增加了不少,這是動(dòng)態(tài)分支的主要成本。但是如果所有的線程,都走的是同一分支,那么另外一個(gè)分支就不用走了。這個(gè)時(shí)候Shader Unit也不會(huì)去傻逼一樣的執(zhí)行另外一個(gè)根本不需要執(zhí)行的分支。此時(shí)性能的損失也不多。并且,在實(shí)際的Shader中,除非特殊情況,大部分Warp內(nèi)的線程,即便在動(dòng)態(tài)分支的情況下,也多半走的是同一分支。

4. 動(dòng)態(tài)分支和代碼優(yōu)化難度有相關(guān)性

這一點(diǎn)經(jīng)常被忽視,就是有動(dòng)態(tài)分支的代碼,因?yàn)闆](méi)準(zhǔn)你要讀寫(xiě)點(diǎn)什么,前后還可能有依賴,往往也難以被優(yōu)化。比如說(shuō)你非要鬧這樣的語(yǔ)句出來(lái):
if(x == 1){   color = tex1.Load(coord);}else if(x == 2){   color = tex2.Load(coord);}...你說(shuō)編譯器怎么給你優(yōu)化。說(shuō)句題外話,為啥要有TextureArray呢?也是為了這個(gè)場(chǎng)合。TextureArray除了紋理不一樣,無(wú)論格式、大小、坐標(biāo)、LoD、偏移,都可以是相同的。這樣甚至可以預(yù)見(jiàn)不同Texture Surface上取數(shù)據(jù)的內(nèi)存延遲也是非常接近的。這樣有很多的操作都可以合并成SIMD,就比多個(gè)Texture分別來(lái)取快得多了。這就是一個(gè)通過(guò)增加了約束(紋理格式、大小、尋址坐標(biāo))把SISD優(yōu)化成SIMD的例子。

定位渲染通道瓶頸的方法

轉(zhuǎn)自:http://blog.csdn.net/rabbit729/article/details/6398343

一般來(lái)說(shuō), 定位渲染通道瓶頸的方法就是改變渲染通道每個(gè)步驟的工作量, 如果吞吐量也改變了, 那個(gè)步驟就是瓶頸.。找到了瓶頸就要想辦法消除瓶頸, 可以減少該步驟的工作量, 增加其他步驟的工作量。  一般在光柵化之前的瓶頸稱作”transform bound”, 三角形設(shè)置處理后的瓶頸稱作”fill bound”

定位瓶頸的辦法: 1. 改變幀緩沖或者渲染目標(biāo)(Render Target)的顏色深度(16 到 32 位), 如果幀速改變了, 那么瓶頸應(yīng)該在幀緩沖(RenderTarget)的填充率上。2. 否則試試改變貼圖大小和貼圖過(guò)濾設(shè)置, 如果幀速變了,那么瓶頸應(yīng)該是在貼圖這里。3. 否則改變分辨率.如果幀速改變了, 那么改變一下pixel shader的指令數(shù)量, 如果幀速變了, 那么瓶頸應(yīng)該就是pixel shader. 否則瓶頸就在光柵化過(guò)程中。4. 否則, 改變頂點(diǎn)格式的大小, 如果幀速改變了, 那么瓶頸應(yīng)該在顯卡帶寬上。5. 如果以上都不是, 那么瓶頸就在CPU這一邊。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 连城县| 灵璧县| 铁岭市| 漠河县| 平阳县| 柳林县| 南郑县| 武威市| 台东市| 都江堰市| 安远县| 拜城县| 峨边| 阿拉尔市| 新疆| 彰武县| 余姚市| 仙桃市| 南昌市| 金山区| 墨江| 五寨县| 扶沟县| 石嘴山市| 宜都市| 阿荣旗| 嘉禾县| 昆山市| 丹阳市| 抚松县| 调兵山市| 浮山县| 额济纳旗| 泉州市| 交口县| 高清| 高州市| 西昌市| 临潭县| 贵定县| 梁河县|