Riepilogo: ottengo il rallentamento dell'FPS non appena provo a colorare gli sprite (cioè: moltiplica la trama con il colore nel frammento shader)
Dettagli:
Hardware: iPod touch 4
Sto disegnando 700 sprite sullo schermo usando glDrawArrays. E sì, sto raggruppando tutti questi in una singola chiamata di sorteggio. Di seguito mostra la struttura dei dati del vertice:
struct Vertex {
float Position[2];
float Color[4];
float Texture[2];
};
Sì, sto inviando colore con ciascun vertice perché devo selettivamente tingere alcuni sprite ma non altri. Di seguito è riportato il framment shader che sto usando:
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord );
}
Fino ad ora funziona alla grande, dandomi 60 FPS completi !!!
MA
Non appena cambio lo shader di frammenti nel modo seguente (per consentire la colorazione):
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord ) * DestinationColor;
}
Utilizzando la seguente trama 64x64 png contenente canale alfa, rendering con glEnable (GL_BLEND):
Le prestazioni scendono a 47 FPS solo a causa di questo singolo cambiamento {solo per moltiplicazione con ONE vector} (FPS misurato utilizzando strumenti xcode e detective OpenGL). Qualche idea su cosa sta succedendo?
Grazie.
Modificare:
Ho anche provato a rimuovere per attributo colore vertice:
struct Vertex {
float Position[2];
float Texture[2];
};
E modificando lo shader di frammenti come segue:
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);
}
Funziona a 52 FPS per 700 sprite (un guadagno di soli 5 FPS). Quindi questa non è interpolazione, sembra che la moltiplicazione sia estremamente costosa. Solo questa UNICA moltiplicazione?