shader程式設計師需要注意的優化Tips

2022-03-15 21:58:18 字數 2144 閱讀 8020

在寫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 改變角色,摒棄學生身份。職場與教室是完全不同的兩個環境,直白來說,教室內彼此的競爭僅僅是面子問題。爭強好勝而已。職場的競爭無論何時何地都存在,只是表面是否和諧而已。所以說,不要傻傻分不清。簡單來說,就拿問問題來說,如果是學生問老師,刨根問底,緊追不捨,都無可厚非。老師自然會知無不答,因為這是職業...

程式設計師要注意的細節

程式設計師在日常生活中以及工作中要注意的一些事情。一 身體最重要 我們程式設計師不能為了工作,把自己的身體整垮了,身體是生命的本錢。程式設計師加強鍛鍊。二 有一顆不斷學習的大腦 現在科技很發達,不斷出現一些新的知識,如果我們只停留在以前的知識中,這樣我們會很快被淘汰的。三 時間管理 加班,遲到,任務...