在寫shader的時候,其實一些寫法對於其執行影響非常大,而且由於gpu和cpu在架構上的不同,**的優化思想也不一樣,最近一直在寫幾個shader,為了效能問題,查閱了很多資料,把一些tips總結下來。
首先要樹立幾個思想:
1.gpu是simd的架構,即單指令多資料流架構,即在gpu上同時執行n個資料和執行1個資料的效率是一樣的,我們要
盡量的把並行的計算搬到gpu上
2.gpu是以向量計算為基礎設計的,也就是說在gpu上執行乙個向量乘法和執行乙個float的乘法的效率是一樣的,
並不向cpu那樣要多執行幾次
3、通常,需要渲染的畫素比頂點數多,而頂點數又比物體數多很多。所以如果可以,盡量將運算從ps移到vs,或直接通過script來設定某些固定值;
所以1.盡量把一些計算合併成向量計算,記住乙個向量計算和乙個float計算那樣快!
比如 float x,y;
x = x * a;
y = y * b;
不如寫成 float2 v = float2(x,y);
v = v*float2(a,b);
因為前一種寫法是兩次乘法計算,而後一種只要1次
2.不要在gpu裡面用分支或者條件判斷這種語句,儘管大多數gpu 的shader支援這種語法,但是多數gpu裡面的
這種控制語句涉及到一些同步等消耗的操作,其實大多數這種語句都可以用數值的方式替代。
比如 你想寫
float4 a;
if(b > 1)
else
可以改寫成
float4 a;
float tmp = step(b,1);
a = tmp * 0.5 + (1-tmp);
if else可以被step出來的0 或1的乘法代替又比如
float4 a;
if(b && c || d && e)
else
可以寫成
float4 a;
float tmp = step(1, (float)b*(float)c + float(d)*float(e));
a = tmp + (1-tmp) * 0.5;
&& 我們用轉換到float後的乘法代替,||可以被判斷加法step 1代替
而這種操作,尤其是shader內建的函式比條件判斷和分支的效率要高很多,別忘了,gpu純粹是為了計算的,而不是做判斷
3.盡量使用shader為我們提供的內建函式,這些內建的函式比我們想象的要快很多,往往應用了某些gpu的特殊特性。
比如要比較a和b誰大用max(a,b),還有例如上面反覆用的step,雖然你可以寫用(float)(a>=1)來替換step(1,a),
但是這還是沒有內建函式更快的,包括常用的saturate()把乙個數歸到0-1,總之一句話,如果能用乙個內建函式替換
你的某些**,就盡量替換。而且這些內建函式基本上都是支援對向量操作的,所以如果用step(a,fixed3(1,2,3))其
實只是一條指令,但是卻可以同時返回用a同1 2 3分別比較的結果。
4.使用swizzle是非常快的,例float4 a = float4(1,1,1,1),用a.wz = float2(2,3)要比 a.w=3; a.z=2要高效很多
5.浮點數精度相關:
float:最高精度,通常32位
half:中等精度,通常16位,-60000到60000,
fixed:最低精度,通常11位,-2.0到2.0,1/256的精度。
盡量使用低精度。對於color和unit length vectors,使用fixed,其他情況,根據取值範圍盡量使用half,實在不夠則使用float。
在移動平台,關鍵是在fragment shader中盡可能多的使用低精度資料。另外,對於多數移動gpu,在低精度和高精度之間轉換是非常耗的,在fixed上做swizzle操作也是很費事的。
6.alpha test
alpha test和clip()函式,在不同平台有不同的效能開銷。
通常使用它來cull那些完全透明的畫素。
但是,在ios和一些android上使用的powervr gpus上面,alpha test非常的昂貴。
7、color mask
在移動裝置上,color mask也是非常昂貴的,所以盡量別使用它,除非真的是需要。
女性程式設計師你需要注意
1.你要努力,因為你沒有男生邏輯思維強,你就要平時多花時間去補上不足.一定不要怨天尤人,那是傻女人做的事.你只需要做好自己就好,並求竭盡自己全力去做好自己的事,在能力之內,盡力去幫助別人解決問題,解決 bug.2.身體最重要,因為要經常熬夜,經常坐著不動,你需要營養跟得上,同時週六週日多去活動活動....
菜鳥程式設計師需要注意的東西
1 改變角色,摒棄學生身份。職場與教室是完全不同的兩個環境,直白來說,教室內彼此的競爭僅僅是面子問題。爭強好勝而已。職場的競爭無論何時何地都存在,只是表面是否和諧而已。所以說,不要傻傻分不清。簡單來說,就拿問問題來說,如果是學生問老師,刨根問底,緊追不捨,都無可厚非。老師自然會知無不答,因為這是職業...
程式設計師要注意的細節
程式設計師在日常生活中以及工作中要注意的一些事情。一 身體最重要 我們程式設計師不能為了工作,把自己的身體整垮了,身體是生命的本錢。程式設計師加強鍛鍊。二 有一顆不斷學習的大腦 現在科技很發達,不斷出現一些新的知識,如果我們只停留在以前的知識中,這樣我們會很快被淘汰的。三 時間管理 加班,遲到,任務...