OpenGL ES着色器降低了太多的性能

时间:2012-05-22 12:29:24

标签: android iphone performance opengl-es glsl

我正在优化适用于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.我在场景中画了很多精灵,为什么那个花了那么多时间?可能是因为它缩放了这么多吗?

2 个答案:

答案 0 :(得分:4)

当您从上述代码中删除“* ucolor”时,会发生很多事情:

  1. 制服 ucolor 未使用
  2. GLSL编译器从活动制服集
  3. 中删除此制服
  4. 当你有程序链接失踪制服的ID 变成-1
  5. 当你为删除的制服做glUniform4fv(-1,value)时 只是立即退出,没有任何更新
  6. 与“* ucolor”相比,这项工作要少得多。

    另外,片段着色器中每个片段的操作少一个。

答案 1 :(得分:2)

您的问题出现在default-2d-tex.shader中的片段着色器中。你有 均匀的vec4 ucolor; 这意味着,每个颜色的组件(RGBA)将转换为32位浮点值。这会严重影响性能。 应该: 均匀的低压vec4 ucolor;