前提:架構
1. GPU的架構爲SIMD(單指令多數據流架構),即在GPU上面執行N個數據和1個數據的效率是同樣的,指令相同的狀況下。因此並行的計算儘可能都放到GPU上。函數
2. GPU的設計基礎爲向量計算。(即向量乘法和單個float 的乘法效率同樣。【CPU須要執行屢次】)性能
性能可優化點:優化
float x; float y;
x = x *a; y = y * b;
將上面的寫法修改成下面的效率會更高。spa
float2 v = float2(x,y); v = v * float2(a,b);
修改後的寫法只須要執行一次。.net
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
高級函數,如非必要,儘可能不要使用,如 sin,cos, sinh, cosh等。( Asin, Acos, Atan很是高。)blog
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);
附:下降精度在某些狀況下不能起到提高性能的做用。
緣由:只計算須要的東西, 能夠減小傳輸的數據量,避免過多的頂點計算,如:過多的光照,或者光照太複雜。
一般狀況下,須要渲染的像素比頂點數多,而頂點數又比物體數多不少。因此若是能夠,儘可能將運算從 FS 移到 VS,或直接經過 script 來設置某些固定值;
並非全部的計算都適合放到腳本中進行,(CPU的計算結果傳遞給GPU裏面也有性能消耗)
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這一邊。