shader效能優化總結

2021-10-24 09:51:43 字數 1679 閱讀 5123

總結一下最近看到的shader效能優化策略:

首先介紹下乙個shader優化工具:glsl-optimizer

通過之前文章的學習,我們應該已經了解到 gpu 是流式處理器,其中的頂點著色單元會每頂點執行一次,而片元著色單元會每片元執行一次。可以想象,每繪製一幀畫面,頂點著色器與片元著色器的**少則執行成百上千次,多則執行幾萬甚至幾百萬次。

因此,如果能恰當地減少頂點著色器與片元著色器每次執行所做的工作量,效能將得到可觀的改善。經常涉及的簡單技巧主要包括著色計算的位置優化以及著色計算的**優化兩方面,具體內容如下:

與著色計算相關的任務有 3 個可能的執行位置: cpu、頂點著色器及片元著色器。從獲得更高畫面質量考慮,很多開發人員會把大量的著色計算相關**放在片元著色器中。但在不影響畫面質量或可以略微犧牲一點畫面質量的情況下,可以考慮將相關**的位置做一些變化,以換取效能的提公升,主要包括如下兩點。

注:在有些情況下,對於某個複雜計算的某部分是所有頂點共享的,那麼,就應該把這部分計算提取出來交由 cpu 一次完成,然後將計算結果作為一致變數傳入頂點著色器供使用。對於乙個 3d 模型而言,頂點少則數百上千,多則幾萬、幾十萬甚至上百萬,這樣做可以降低計算負載,獲得顯著的效能提公升。

編寫著色器**時,開發人員應該特別小心,這是由於著色器**的執行頻率很高,因此應該盡量優化這部分**,使其運算量以及複雜度降到最低,這樣會提高著色程式的執行效率。具體需要注意以下幾點。

在編寫完整的著色器**過程中,除了要考慮執行計算任務的位置、計算量等,對於一些內建函式的使用、方法的宣告、變數的使用等也要時刻注意,出於效能方面的考慮,一般應該注意以下幾點。

//直接用**計算,好的做法

……float dis=distance(positiona,positionb)

;float disfactor=dis/scale;

……//先宣告函式,再呼叫,對於目前的 gpu 不太合適的做法

float caldisfactor(vec3 positiona, vec3 positionb )

//直觀的易於編寫的用分支語句完成的**

vec4 projcolor=texture(stexture,vec2(s,t))

;if(a>0.9999)

else if(a<0.0001)

else

//適合提高 gpu 執行效率的使用內建函式替代分支操作的**

vec4 projcolor=texture(stexture,vec2(s,t))

;float a=step(0.9999,projcolor.r)

;float b=step(0.0001,projcolor.r)

;float c=1.0-sign(a)

;fragcolor=a*colora+(1.0-b)*colorb+b*c*mix(colorb,colora,smoothstep(0.0,1.0,projcolor.r))

;

其中,著色器**巧妙地使用內建函式避免了很多分支操作,將分支操作化解為順序執行的函式運算。這是一種著色器程式設計常用的開發技巧,有需要時也可盡量採用。

選擇紋理圖時,出於效能的考慮,需要注意以下幾點。

使用紋理圖時,不能拿到一幅紋理圖就直接使用,需要對紋理圖做一些必要的處理後再使用。這樣就能很好地避免資源的浪費,出於效能考慮,一般應該注意以下幾點。

效能優化總結

儘量減少布局的層級,有選擇的使用功能較為複雜,效能較低的viewgroup,如 relativelayout,但推薦使用relativilayout來替換多重巢狀的linearlayout,減少布局層級。推薦使用,和viewstub來布局。避免在view的ondraw中進行大量的操作。主要體現於兩個...

效能優化總結

最近在查效能優化,總結了以下幾條 第一 在接受訊息 socket地方 打上每條訊息的消耗 這個能快速定位到 哪些函式消耗的比較高 第二 在遊戲主迴圈中,打上沒幀的消耗 如果消耗是穩定網 的 說明一定有物件建立了沒有刪掉 並且這個物件還在 主 迴圈中 可以檢查一下 註冊的各地地方的定時器 陣列是否有物...

js 效能優化總結

1 盡量不要使用 eval alert hello world var sayhi new function alert hello world settimeout alert hello world 100 全域性變數 for x in list 3 減少dom訪問。重複訪問dom低效 for ...