要点: 一旦我尝试着色精灵(即:在片段着色器中将纹理与颜色相乘),我就会使FPS减速
详细信息:
硬件:iPod touch 4
使用包含alpha通道的64x64 png纹理,使用glEnable(GL_BLEND)进行渲染。 (带投影的笑脸)
我使用glDrawArrays在屏幕上绘制700个精灵。是的,我正在一次抽奖中对所有这些进行批处理。以下显示了Vertex数据结构:
struct Vertex {
float Position[2];
float Color[4];
float Texture[2];
};
是的我正在为每个顶点发送颜色,因为我有选择地需要为某些精灵着色而不是其他精灵。以下是我正在使用的片段着色器:
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord );
}
直到现在它工作得很好,给我60分FPS !!!
BUT
一旦我将片段着色器更改为以下(允许着色):
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord ) * DestinationColor;
}
性能下降到47 FPS只是因为这个单一的变化{只需乘以 ONE 矢量}(使用xcode仪器和OpenGL侦测器测量FPS)。有什么想法发生了什么?
感谢。
修改
我也试过剥离每个顶点颜色属性:
struct Vertex {
float Position[2];
float Texture[2];
};
修改片段着色器如下:
precision lowp float;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord ) * vec4(1.0,0.0,0.0,1.0);
}
700精灵以52 FPS的速度运行(增益仅为5 FPS)。所以这不是插值,似乎乘法是非常昂贵的。只是这一次乘法?
答案 0 :(得分:0)
根据我的经验,alpha混合会很快降低帧速率,尤其是在旧设备上。我的猜测是,乘以该颜色实际上涉及GPU的大量额外计算(将帧缓冲中已有的颜色分解和乘以)。老实说,如果你在第四代iPod touch上仍然保持47 fps的速度,那么你的表现似乎相当不错。您可能会在较新的设备上恢复到60。如果您正在对绘制调用进行批处理,那么使用这样一个简单的着色器并没有更多的优化。
您可以尝试渲染目标颜色不会影响最终颜色的所有精灵,使用原始纹理查找着色器作为单独的批处理,然后使用与颜色相乘的着色器绘制其余颜色,但是排序可能不值得。
修改强>
还有另一个SO答案here可能更符合您的要求。它基本上说片段着色器中更高精度的浮点乘法可以扼杀性能。您可以手动将采样器的精度设置为更低,并以此方式提高性能。