我正在优化适用于iPhone和Android的游戏。我正在使用4个着色器绘制场景,我注意到如果我将其中一个更改为另一个,则fps从32变为42,即使使用该着色器仅绘制了1个精灵,并且这两个着色器的唯一区别只是片段着色器中的产品。
这些是着色器:
默认-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混合。
编辑2
我犯了一个错误。精灵缩放11倍:32x48。 如果我根本不画那个精灵,fps会变成45.我在场景中画了很多精灵,为什么那个花了那么多时间?可能是因为它缩放了这么多吗?答案 0 :(得分:4)
当您从上述代码中删除“* ucolor”时,会发生很多事情:
与“* ucolor”相比,这项工作要少得多。
另外,片段着色器中每个片段的操作少一个。
答案 1 :(得分:2)
您的问题出现在default-2d-tex.shader中的片段着色器中。你有 均匀的vec4 ucolor; 这意味着,每个颜色的组件(RGBA)将转换为32位浮点值。这会严重影响性能。 应该: 均匀的低压vec4 ucolor;