我正在優化適用於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.我在場景中畫了很多精靈,爲什麼那個會花費那麼多時間?難道是因爲它縮小了很多?
作爲建議,在分析時測量幀渲染時間,而不是幀率。 [Framerate並不總是最好的度量標準](http://www.altdevblogaday.com/2011/07/23/lying-numbers/)。你看到這種放緩的硬件和操作系統版本是什麼? Android和iOS上的放緩是否一致?這個精靈有多大的像素?你啓用了什麼樣的混合模式? –
這些信息在哪裏?您只能提供不相關的紋理大小。這個精靈在屏幕上佔有多少個像素?它不是全屏嗎?縮放到4x是什麼意思? – djmj
我很難發現代碼中的差異只是片段着色器中的最終輸出乘法。你應該已經發布了這個部分。我懷疑這麼小的乘法會導致性能下降。你的渲染通道設置如何?如果您的渲染設置模擬更多的像素,這通常用於後期處理,這可能會導致性能下降。 – djmj