Ich bin sehr neu für OpenGL.
Ich versuche, strukturierte 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 mache ich etwas falsch ...
Code:
%Vor%Vertex-Shader:
%Vor%Fragment Shader:
%Vor%Testplattform ist Galaxy S3. Im Profiler sehe ich, dass etwa 60ms den eglSwapBuffers Aufruf brauchen.
Wie kann ich Quads mit großen Texturen schnell zeichnen?
Dies könnte an der Größe Ihrer Texturen und an der OpenGL-Treiberimplementierung der Geräte liegen, die Sie verwenden.
Die meisten modernen GPUs machen ziemlich gute Arbeit mit NPOT (keine Potenz von zwei) Texturen, aber dies bewirkt eine Neuskalierung der Textur jedes Mal, wenn sie auf die nächste Potenz von 2 gezogen werden muss (in Ihrem Fall 1024X1024).
Versuchen Sie, die folgenden 2 Lösungen zu verwenden:
1- Konvertieren Sie Ihre Texturen in 1024x1024 und verwenden Sie die Koordinaten in Ihren Geometrien, um nur das zu zeichnen, was Sie brauchen (900x900)
2- Versuchen Sie, Mipmaps zu generieren. Wenn Sie viel zoomen, ist dies in vielen Szenarien ein Leistungsvorteil.
Ihr S3 hat wahrscheinlich etwa 600 Millionen Texel / Sek. Füllrate (siehe GLBenchmark ). Wenn Sie Fullscreen-Quads rendern, erhalten Sie mit zehn doppelt texturierten Quads 20 Millionen Texel pro Frame. Unter der Annahme, GLBenchmark tut, was es sagt (messen Texturierung Durchsatz) 20M Texel ist 1/30 der Füllrate, was 33ms die besten die hw kann einen Rahmen zu verarbeiten. Framebuffer Blending Ich bin mir sicher, dass ich aktiv um die Füllrate konkurriere - 10 Millionen Pixel sind ziemlich gemischt, daher kann ich annehmen, dass der Flaschenhals auch da sein könnte.
Was Sie versuchen können, um sicherzustellen, was der langsame Teil ist - reduzieren Sie die Texturgröße auf 512x512 und sehen Sie, wie sich dies auf die Leistung auswirkt. Reduzieren Sie die Bildschirmgröße der gerenderten Quadrate (erheblich, wie bei Texturen - machen Sie es zum Beispiel halb / viertel des Bildschirms).
Nach meiner Erfahrung ergeben sich Texturleistungsprobleme normalerweise aus dem Aufbau der MIPMAP-Filterung. Bei folgenden nicht optimal eingestellten Parametern (minimale Einstellungen) kann viel Leistung verloren gehen:
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);
Versuchen Sie nach Möglichkeit, die Tiefenprüfung zu deaktivieren. @ Marekbs Ratschlag zur Texturkomprimierung bietet auch eine Menge Performance-Vorteile.
Tags und Links android opengl-es opengl-es-2.0 glsles