移動端 Shader 性能優化經常使用點

前提:架構

1. GPU的架構爲SIMD(單指令多數據流架構),即在GPU上面執行N個數據和1個數據的效率是同樣的,指令相同的狀況下。因此並行的計算儘可能都放到GPU上。函數

2. GPU的設計基礎爲向量計算。(即向量乘法和單個float 的乘法效率同樣。【CPU須要執行屢次】)性能

 

性能可優化點:優化

1. 合併單個計算爲向量運算。

float x;
float y;

x = x *a; y = y * b;

 將上面的寫法修改成下面的效率會更高。spa

float2 v = float2(x,y);
v = v * float2(a,b);

  修改後的寫法只須要執行一次。.net

2. 不要使用條件判斷, FOR 語句。(性能不高,會涉及到同步)。

float4 a ;
if( b > 1){
  a.a = 1;
} else {
 a.a = 0.5;
}

  上面的條件判斷可使用 內置函數 step 進行替換。設計

flaot4 a;

float t = step(b, 1.0);
a = tmp * 0.5 + (1.0 - tmp);

  替換的根本緣由在於動態分支orm

3. 儘量使用內置函數。(內置函數大部分都使用了GPU的特殊特性)。

  高級函數,如非必要,儘可能不要使用,如 sin,cos, sinh, cosh等。( Asin, Acos, Atan很是高。)blog

4. swizzle 的效率高於單步賦值。

float4 a = float4(1.0, 1.0, 1.0, 1.0);

a.w = 2.0;
a.z = 2.0;

  上面的代碼修改成下面的效率更高。ip

float4 a = float4(1.0, 1.0, 1.0, 1.0);
a.wz= float2(2.0, 2.0);

  

5. 若是非必要,儘可能不使用高精度。(高精度32位,中等精度爲16位,低精度爲12位。)

  附:下降精度在某些狀況下不能起到提高性能的做用。

6. 只計算須要的東西。運算儘可能放在VS或者腳本中進行。

  緣由:只計算須要的東西, 能夠減小傳輸的數據量,避免過多的頂點計算,如:過多的光照,或者光照太複雜。

  一般狀況下,須要渲染的像素比頂點數多,而頂點數又比物體數多不少。因此若是能夠,儘可能將運算從 FS 移到 VS,或直接經過 script 來設置某些固定值;

  並非全部的計算都適合放到腳本中進行,(CPU的計算結果傳遞給GPU裏面也有性能消耗)

7. 其餘

  alpha test, clip , Color Mask 慎用。不一樣平臺上消耗不同,部分機型可能性能會很是差。

 

 

=========================如下內容爲轉載=============================

定位渲染通道瓶頸的方法
轉自:http://blog.csdn.net/rabbit729/article/details/6398343

通常來講, 定位渲染通道瓶頸的方法就是改變渲染通道每一個步驟的工做量, 若是吞吐量也改變了, 那個步驟就是瓶頸.。找到了瓶頸就要想辦法消除瓶頸, 能夠減小該步驟的工做量, 增長其餘步驟的工做量。
  通常在光柵化以前的瓶頸稱做」transform bound」, 三角形設置處理後的瓶頸稱做」fill bound」

定位瓶頸的辦法: 1. 改變幀緩衝或者渲染目標(Render Target)的顏色深度(16 到 32 位), 若是幀速改變了, 那麼瓶頸應該在幀緩衝(RenderTarget)的填充率上。2. 不然試試改變貼圖大小和貼圖過濾設置, 若是幀速變了,那麼瓶頸應該是在貼圖這裏。3. 不然改變分辨率.若是幀速改變了, 那麼改變一下pixel shader的指令數量, 若是幀速變了, 那麼瓶頸應該就是pixel shader. 不然瓶頸就在光柵化過程當中。4. 不然, 改變頂點格式的大小, 若是幀速改變了, 那麼瓶頸應該在顯卡帶寬上。5. 若是以上都不是, 那麼瓶頸就在CPU這一邊。

相關文章
相關標籤/搜索