2013-02-21 15 views
8

Sono molto nuovo nuovo a OpenGL.Android Openg GL ES 2 disegno grandi trame lento

Sto provando a disegnare quads strutturati (2 triangoli). La dimensione della texture è 900x900px. Non ho problemi con un quad, ma quando cerco di disegnare 5-10 quad vedo un rallentamento notevole.

Forse sto facendo qualcosa di sbagliato ...

Codice:

public void onDrawFrame(GL10 gl) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    ... matrix calculation ... 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
} 

Vertex shaders:

uniform mat4 uMVPMatrix; 
attribute vec4 vPosition; 
attribute vec2 a_TexCoordinate; 
varying vec2 v_TexCoordinate; 
void main() { 
    gl_Position = uMVPMatrix*vPosition; 
    v_TexCoordinate = a_TexCoordinate; 
} 

Frammento di shading:

precision mediump float; 
    uniform sampler2D u_PreviewTexture; 
    varying vec2 v_TexCoordinate; 

    void main() { 
     vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate); 
     gl_FragColor = color; 
    } 

piattaforma di test è Galaxy s3. Nel profiler vedo che circa 60 ms prende la chiamata eglSwapBuffers.

Come posso disegnare quad con texture grandi velocemente?

+0

informazioni un po 'più importanti: le bitmap sono nel formato ARGB_8888 e GL_BLEND è abilitato. –

risposta

4

Ciò potrebbe essere dovuto alle dimensioni delle trame e all'implementazione del driver OpenGL dei dispositivi che si stanno utilizzando.

La maggior parte delle GPU moderne fa un buon lavoro con le trame NPOT (nessuna potenza di due), ma questo causa una riscalatura della trama ogni volta che deve essere disegnata alla potenza più vicina di 2 (nel tuo caso 1024X1024) .

tenta di utilizzare il 2 seguenti soluzioni:

1- Convertire le texture a 1024x1024 e utilizzare le coordinate nelle geometrie solo a disegnare quello che ti serve (900x900)

2- tenta di generare mipmaps, se hai un sacco di zoom questo è un miglioramento delle prestazioni in molti scenari.

+0

Se la trama è una compressione statica, potrebbe ridurre anche il segnale di memoria. La compressione ETC1 è probabilmente disponibile su tutti i dispositivi mobili. Supporta solo il formato RGB, senza canale alfa. – marekb

+0

Grazie per le risposte. Ho provato a ridimensionare le texture a 1024x1024 ma non fa alcuna differenza. E non posso usare ETC1 perché ottengo bitmap in runtime. Ho cercato di profilare le chiamate gpu e sembra che tutte le chiamate richiedano meno di 2 ms ... –

+0

un altro test: 10 quad, ciascuno con due texture 1024x1024 (mix()): la chiamata eglSwapBuffers richiede 35-40 ms ma in Profiler GPU: tutto il processo di disegno richiede meno di 3 ms. –

1

L'S3 ha probabilmente circa 600 M di texels/sec fillrate (vedere GLBenchmark). Se stai riproducendo quad a schermo intero: dieci quad a trama doppia danno 20M di texel per fotogramma. Supponendo che GLBenchmark faccia quello che dice (misura il throughput della texturing) 20M texels è 1/30 del fillrate, dando 33ms il best hw può elaborare un frame. Il mix di framebuffer sono sicuro che compete attivamente per il fillrate: 10 milioni di pixel sono abbastanza numerosi, quindi posso immaginare che il collo di bottiglia potrebbe essere lì.

Che cosa si può provare per assicurarsi di quale sia la parte lenta - ridurre la dimensione della trama per dire 512x512 e vedere come influisce sulle prestazioni. Riduci la dimensione dello schermo dei quad renderizzati (considerevolmente, come con le trame - ad esempio, rendilo mezzo/quarto dello schermo).

0

In base alla mia esperienza, i problemi relativi alle prestazioni della trama derivano in genere da come viene configurato il filtro MIPMAP. Un sacco di prestazioni può essere perduto con i seguenti parametri non impostati in modo ottimale (impostazioni minime indicate):

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Se possibile, provare a disabilitare il test di profondità. Il consiglio di @ marekb sulla compressione delle texture offre anche molti vantaggi in termini di prestazioni.