在Galaxy SII和SIII上进行非常缓慢的分裂操作

时间:2013-04-28 13:36:23

标签: android opengl-es-2.0 glsles

我的地形使用着色器,它本身使用四种不同的纹理。它在Windows和Linux机器上运行良好,但在Android上它只能在两个星系上获得~25FPS。我认为,纹理是问题,但不是,因为看起来问题在于我划分纹理坐标并使用frac来获得平铺坐标的部分。没有它,我得到60FPS。

// Material data.
//uniform vec3 uAmbient;
//uniform vec3 uDiffuse;

//uniform vec3 uLightPos[8];
//uniform vec3 uEyePos;
//uniform vec3 uFogColor;
uniform sampler2D terrain_blend;
uniform sampler2D grass;
uniform sampler2D rock;
uniform sampler2D dirt;

varying vec2 varTexCoords;
//varying vec3 varEyeNormal;
//varying float varFogWeight;

//------------------------------------------------------------------
//  Name: fog
//  Desc: applies calculated fog weight to fog color and mixes with
//  specified color.
//------------------------------------------------------------------
//vec4 fog(vec4 color) {
//  return mix(color, vec4(uFogColor, 1.0), varFogWeight);
//}

void main(void)
{
    /*vec3 N = normalize(varEyeNormal);
    vec3 L = normalize(uLightPos[0]);
    vec3 H = normalize(L + normalize(uEyePos));

    float df = max(0.0, dot(N, L));
    vec3 col = uAmbient + uDiffuse * df;*/

    // Take color information from textures and tile them.
    vec2 tiledCoords = varTexCoords;
    //vec2 tiledCoords = fract(varTexCoords / 0.05); // <========= HERE!!!!!!!!!
    //vec4 colGrass = texture2D(grass, tiledCoords);
    vec4 colGrass = texture2D(grass, tiledCoords);
    //vec4 colDirt = texture2D(dirt, tiledCoords);
    vec4 colDirt = texture2D(dirt, tiledCoords);
    //vec4 colRock = texture2D(rock, tiledCoords);
    vec4 colRock = texture2D(rock, tiledCoords);
    // Take color information from not tiled blend map.
    vec4 colBlend = texture2D(terrain_blend, varTexCoords);
    // Find the inverse of all the blend weights.
    float inverse = 1.0 / (colBlend.r + colBlend.g + colBlend.b);
    // Scale colors by its corresponding weight.
    colGrass *= colBlend.r * inverse;
    colDirt *= colBlend.g * inverse;
    colRock *= colBlend.b * inverse;

    vec4 final = colGrass + colDirt + colRock;

    //final = fog(final);
    gl_FragColor = final;
}

注意:还有一些用于光计算和雾的代码,但它没有被使用。我指出了这条线,当取消注释时会导致大量延迟。我尝试使用地板并手动计算小数部分,但滞后是相同的。什么可能是错的?

编辑:现在我不明白了。

此:

vec2 tiledCoords = fract(varTexCoords * 2.0);

运行得很好。

此:

vec2 tiledCoords = fract(varTexCoords * 10.0);

在SIII上平均运行。

此:

vec2 tiledCoords = fract(varTexCoords * 20.0);

...滞后

此:

vec2 tiledCoords = fract(varTexCoords * 100.0);

5FPS仍然比我预期的好......

那是什么给出的?为什么会这样?根据我的理解,这应该没有任何区别。但确实如此。还有一个巨大的。

1 个答案:

答案 0 :(得分:0)

我会在探查器上运行你的代码(检查Mali-400),但从它的外观来看,你正在杀死纹理缓存。对于计算的第一个像素,获取所有这4个纹理查找,但也将连续数据提取到纹理高速缓存中。对于下一个像素,您不是访问缓存中的数据,而是看起来相当远(10,20 ...等),这完全违背了这种缓存的目的。

这当然是猜测,没有适当的分析很难说。

编辑:@harism也指出了你的方向。