2012-05-22 146 views
1

我正在優化適用於iPhone和Android的遊戲。我使用4個着色器繪製場景,並且我注意到,如果將其中一個更改爲另一個,則fps將從32變爲42,即使該着色器中只繪製了1個精靈,並且此2個着色器中唯一的區別只是fragmente着色器中的一個產品。OpenGL ES着色器降低了太多的性能

這些都是着色器:

默認-2D-tex.shader

#ifdef GL_ES 
precision highp float; 
precision lowp int; 
#endif 

#ifdef VERTEX 

uniform mat4  umvp; 

attribute vec4  avertex; 
attribute vec2  auv; 

varying vec2  vuv; 

void main() 
{ 
    // Pass the texture coordinate attribute to a varying. 
    vuv = auv; 

    // Here we set the final position to this vertex. 
    gl_Position = umvp * avertex; 
} 

#endif 

#ifdef FRAGMENT 

uniform sampler2D map0; 
uniform vec4 ucolor; 

varying vec2  vuv; 

void main() 
{ 
    gl_FragColor = texture2D(map0, vuv) * ucolor; 
} 

#endif 

默認-2D-TEX-white.shader

#ifdef GL_ES 
precision highp float; 
precision lowp int; 
#endif 

#ifdef VERTEX 

uniform mat4  umvp; 

attribute vec4  avertex; 
attribute vec2  auv; 

varying vec2  vuv; 

void main() 
{ 
    // Pass the texture coordinate attribute to a varying. 
    vuv = auv; 

    // Here we set the final position to this vertex. 
    gl_Position = umvp * avertex; 
} 

#endif 

#ifdef FRAGMENT 

uniform sampler2D map0; 

varying vec2  vuv; 

void main() 
{ 
    gl_FragColor = texture2D(map0, vuv); 
} 

#endif 

再次,
如果我修改default-2d-tex.shader並刪除產品「* ucolor」,fps從32到42,我只用它在場景中的一個精靈!

這是正常的嗎?爲什麼這個着色器如此緩慢,我該如何改進它?

編輯:

我看到一個等比例上都iPod和Android的這一業績增速放緩。兩者都是PowerVr SGX GPU(iPod第三代和三星Galaxy SL -PowerVR SGX 530-)。 iOS版本是4.1和Android是2.3.3

我正在繪製的精靈被縮放以填滿屏幕(縮放到4x),並且我每幀繪製一次。它來自紋理貼圖,所以紋理實際上更大(1024x1024),但採取的部分是80x120。 Alpha混合已啓用。

EDIT 2

我犯了一個錯誤。精靈的縮放比例爲11x:32x48。 如果我沒有畫出那個精靈,那麼fps會達到45.我在場景中畫了很多精靈,爲什麼那個會花費那麼多時間?難道是因爲它縮小了很多?

+2

作爲建議,在分析時測量幀渲染時間,而不是幀率。 [Framerate並不總是最好的度量標準](http://www.altdevblogaday.com/2011/07/23/lying-numbers/)。你看到這種放緩的硬件和操作系統版本是什麼? Android和iOS上的放緩是否一致?這個精靈有多大的像素?你啓用了什麼樣的混合模式? –

+0

這些信息在哪裏?您只能提供不相關的紋理大小。這個精靈在屏幕上佔有多少個像素?它不是全屏嗎?縮放到4x是什麼意思? – djmj

+0

我很難發現代碼中的差異只是片段着色器中的最終輸出乘法。你應該已經發布了這個部分。我懷疑這麼小的乘法會導致性能下降。你的渲染通道設置如何?如果您的渲染設置模擬更多的像素,這通常用於後期處理,這可能會導致性能下降。 – djmj

回答

4

當您刪除「* ucolor」從上述代碼中的許多事情發生了:

  1. 均勻ucolor成爲閒置
  2. GLSL編譯器將刪除活躍制服這個統一設置
  3. 當你有你的程序鏈接了缺失的制服ID 變成了-1
  4. 當你做glUniform4fv(-1,value)爲被刪除的制服時它 剛剛退出inst Antly,沒有任何更新

與具有「* ucolor」相比,這是少得多的工作。

此外,這是片段着色器中每個片段少一個操作。

+2

然後使用制服將是最大的性能殺手與他的下降幀率有關!我從來沒有觀察到使用制服的這種下拉菜單。 – djmj

+0

它是。該着色器只有1個不斷更新的制服。制服被刪除。這解釋了一些性能提升。着色器本身也變得更輕巧。這解釋了更多的速度增益。 –

+0

再次說明:我每幀使用一次着色器。 @SergeyK。你認爲那個着色器價格昂貴嗎? – Damian

2

你的問題在default-2d-tex.shader的片段着色器中。你有 uniform vec4 ucolor;這意味着,每個顏色的組件(RGBA)都將被轉換爲32位浮點值。這大大降低了性能。 應該是: uniform lowp vec4 ucolor;