Android Openg GL ES 2绘制大纹理慢

mik*_*_os 8 android opengl-es opengl-es-2.0 glsles

我是新的OpenGL的.

我正在尝试绘制纹理四边形(2个三角形).纹理的大小是900x900px.我对一个四边形没有任何问题但是当我试图绘制5-10个四边形时,我看到明显的减速.

也许我做错了什么......

码:

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);
}
Run Code Online (Sandbox Code Playgroud)

顶点着色器:

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

片段着色器:

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

    void main() {
      vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate);
      gl_FragColor = color;
    }
Run Code Online (Sandbox Code Playgroud)

测试平台是Galaxy S3.在分析器中,我看到大约60ms需要eglSwapBuffers调用.

如何快速绘制具有大纹理的四边形?

Mau*_*tti 4

这可能是由于纹理的大小以及您正在使用的设备的 OpenGL 驱动程序实现造成的。

大多数现代 GPU 在 NPOT(无 2 的幂)纹理方面做得相当好,但这会导致每次需要将纹理绘制到最接近的 2 的幂(在您的情况下为 1024X1024)时重新缩放纹理。

尝试使用以下2种解决方案:

1-将纹理转换为 1024x1024 并使用几何图形中的坐标仅绘制您需要的内容 (900x900)

2- 尝试生成 mipmap,如果您有大量缩放,这在许多情况下都是性能救星。