Android Openg GL ES 2绘制大纹理速度缓慢

我对OpenGL 陌生。

我试图画纹理四边形(2个三angular形)。 纹理的大小是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); } 

顶点着色器:

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

片段着色器:

  precision mediump float; uniform sampler2D u_PreviewTexture; varying vec2 v_TexCoordinate; void main() { vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate); gl_FragColor = color; } 

testing平台是Galaxy S3。 在profiler中,我看到大约60ms需要调用eglSwapBuffers。

我怎样才能用大纹理快速绘制四边形?

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

大多数现代GPU在NPOT(无两次幂)纹理方面做得相当不错,但是每次需要绘制到最近的2的幂(以1024X1024为例)时,会导致纹理的重新缩放。

尝试使用以下两种解决scheme:

1-将您的纹理转换为1024×1024,并使用几何中的坐标来绘制您所需要的(900×900)

2-尝试生成mipmap,如果你有很多缩放,这是许多情况下的性能救星。

你的S3可能有大约600M texels / sec的填充率(参见GLBenchmark )。 如果你正在渲染全屏四边形 – 十个双纹理四边形每帧可以提供20M的纹理。 假设GLBenchmark做了它所说的(测量纹理吞吐量),20M texels是填充率的1/30,给出33ms是最好的,hw可以处理一帧。 Framebuffer混合我确定积极争取填充率 – 混合10M像素是相当多的,所以我可以猜测瓶颈也可能在那里。

你可以尝试确定什么是缓慢的部分 – 减less纹理大小,512×512,看看它是如何影响性能。 减less渲染四边形的屏幕大小(相当于纹理 – 例如,使其成为屏幕的一半/四分之一)。

根据我的经验,纹理性能问题通常源于如何设置MIPMAP过滤。 以下参数未设置最佳状态(显示的最小设置)会导致很多性能丢失:

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

如果可能,请尝试禁用深度testing。 @ marekb关于纹理压缩的build议也提供了很多性能上的好处。