1

我正在优化一款适用于 iPhone 和 Android 的游戏。我正在使用 4 个着色器来绘制场景,我注意到如果我将其中一个更改为另一个,则 fps 从 32 变为 42,即使该着色器仅绘制了 1 个精灵,而这 2 个着色器的唯一区别只是片段着色器中的一个产品。

这些是着色器:

default-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

default-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

我正在绘制的精灵被缩放以填充屏幕(缩放到 4 倍),并且我每帧绘制一次。它取自纹理贴图,因此纹理实际上更大(1024x1024),但所取的部分为 80x120。启用 Alpha 混合。

编辑 2

我犯了一个错误。精灵缩放 11 倍:它的 32x48。如果我根本不画那个精灵,fps 会变成 45。我在场景中画了很多精灵,为什么要花这么多时间?难道是因为它的规模太大了?

4

2 回答 2

4

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

  1. 统一的 ucolor变为未使用
  2. GLSL 编译器从活动制服集中移除这个制服
  3. 当您链接程序时,丢失制服的 ID 变为 -1
  4. 当您对已移除的制服执行 glUniform4fv( -1, value ) 时,它会立即退出,无需任何更新

与使用“* ucolor”相比,这要少得多。

此外,在片段着色器中,每个片段的操作更少。

于 2012-05-22T16:04:07.300 回答
2

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

于 2012-10-24T09:50:05.560 回答