【发布时间】:2012-05-28 22:42:19
【问题描述】:
我正在优化一款适用于 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。我在场景中画了很多精灵,为什么要花这么多时间?难道是因为它的规模太大了?
【问题讨论】:
-
作为建议,在分析时测量帧渲染时间,而不是帧速率。 Framerate isn't always the best metric。您在哪个硬件和操作系统版本上看到了这种减速? Android 和 iOS 的减速是否一致?这个精灵有多大的像素?您启用了哪种混合模式?
-
我很难发现代码中的差异只是片段着色器中的最终输出乘法。你应该只发布那部分。而且我怀疑这么小的乘法会导致性能下降。您的渲染通道设置如何?如果您的渲染设置模拟更多像素(通常用于后处理),则可能会导致性能下降。
-
信息在哪里?您只提供不相关的纹理大小。这个精灵在屏幕上占据了多少像素?它不是全屏还是缩放到 4 倍是什么意思?
-
@djmj:我澄清了区别是“* ucolor”,我添加了所有信息。请再读一遍,精灵被缩放以填满屏幕(ipod 为 320x480,android 为 480x800)
-
请注意,iOS 4.2 引入了更好的着色器编译器,因此您可能不会在使用该操作系统版本及更高版本的设备上看到这么多的减速。我的猜测是混合是这里的罪魁祸首,因为在这些设备上这是一项极其昂贵的操作。混合通常可以成倍增加片段着色器中额外计算的影响。尝试将下面的内容渲染为不透明元素,首先关闭混合,然后仅对这个叠加精灵启用混合并绘制它。
标签: android iphone performance opengl-es glsl