2013-02-21 8 views
8

Ich bin sehr neu zu OpenGL.Android Openg GL ES 2 Zeichnung große Texturen langsam

Ich versuche, texturierte Quads (2 Dreiecke) zu zeichnen. Die Größe der Textur ist 900x900px. Ich habe keine Probleme mit einem Quad, aber wenn ich versuche 5-10 Quads zu zeichnen, sehe ich merklich langsamer.

Vielleicht etwas, was ich falsch mache ...

Code:

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 Shadern:

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

Fragment-Shader:

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

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

Testing-Plattform Galaxy S3. Im Profiler sehe ich, dass etwa 60ms den eglSwapBuffers Aufruf nehmen.

Wie kann ich schnell Quads mit großen Texturen zeichnen?

+0

ein bisschen wichtiger info: die Bitmaps ist im Format ARGB_8888 und GL_BLEND ist aktiviert. –

Antwort

4

Dies kann an der Größe Ihrer Texturen und an der OpenGL-Treiberimplementierung der von Ihnen verwendeten Geräte liegen.

Die meisten modernen GPUs machen ziemlich gute Arbeit mit NPOT (keine Zweierpotenz) Texturen, aber dies bewirkt eine Neuskalierung der Textur jedes Mal, wenn es auf die nächste Potenz von 2 gezeichnet werden muss (in deinem Fall 1024X1024) .

Versuchen Sie, die folgenden zwei Lösungen zu verwenden:

1- Konvertieren Sie Ihre Texturen zu 1024x1024 und die Koordinaten in Ihren Geometrien verwenden, um nur zu zeichnen, was man braucht (900x900)

2- Versuchen Mipmaps zu erzeugen, Wenn Sie viel zoomen, ist dies in vielen Szenarien eine Leistungsersparnis.

+0

Wenn Textur statische Komprimierung ist, könnte Speicher Bandwich auch reduzieren. Die ETC1-Komprimierung ist wahrscheinlich auf allen mobilen Geräten verfügbar. Es unterstützt nur RGB-Format, ohne Alpha-Kanal. – marekb

+0

Vielen Dank für die Antworten. Ich habe versucht, Texturen auf 1024x1024 zu skalieren, aber es macht keinen Unterschied. Und ich kann ETC1 nicht benutzen, weil ich in Runtime Bitmaps bekomme. Ich versuchte, gpu Anrufe profilieren und es sieht aus wie alle Anrufe dauert weniger als 2ms ... –

+0

ein anderer Test: 10 Quads, jeweils mit zwei 1024x1024 Texturen (mix() wird verwendet): eglSwapBuffers Anruf dauert abiut 35-40ms aber in GPU Profiler alle Zeichnungsprozess dauert weniger als 3ms. –

1

Ihr S3 hat wahrscheinlich etwa 600 M Texel/Sek. Füllrate (siehe GLBenchmark). Wenn Sie Vollbild-Quads rendern - zehn Doppeltextur-Quads ergeben 20 Mio. Texel pro Frame. Unter der Annahme, GLBenchmark tut, was es sagt (Texturierung Durchsatz messen) 20M Texel ist 1/30 der Füllrate, wodurch 33ms die besten der hw kann einen Rahmen verarbeiten. Framebuffer Blending Ich bin mir sicher, dass ich aktiv um die Füllrate konkurriere - 10 Millionen Pixel sind gemischt, also kann ich erraten, dass der Engpass auch da sein könnte.

Was Sie versuchen können, um sicherzustellen, was der langsame Teil ist - reduzieren Texturgröße zu sagen, 512x512, und sehen, wie es die Leistung beeinflusst. Reduzieren Sie die Bildschirmgröße der gerenderten Quadrate (erheblich, wie bei Texturen - machen Sie es zum Beispiel halb/viertel des Bildschirms).

0

Meiner Erfahrung nach hängen Texturleistungsprobleme normalerweise davon ab, wie die MIPMAP-Filterung eingerichtet wird. Viel Leistung kann mit den folgenden Parametern nicht optimal (minimale Einstellungen dargestellt) verloren:

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);

Wenn möglich, versuchen eine gründlichere Prüfung zu deaktivieren. @ Marekbs Ratschlag zur Texturkomprimierung bietet auch eine Menge Performance-Vorteile.