我正在优化一款适用于 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。我在场景中画了很多精灵,为什么要花这么多时间?难道是因为它的规模太大了?