提高Android上OpenGL ES填充率的技巧

在我的dynamic壁纸,我正在绘制覆盖整个屏幕的3纹理四边形。 在Nexus One上,我得到了40fps。 我正在寻找提高性能的方法。

四边形被混合在一起,纹理从RGB_8888位图加载。 1024×1024是纹理。

我有

glDisable(GL_DITHER); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); glDisable(GL10.GL_LIGHTING); glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

我试过的东西都是40fps:

  • 将纹理尺寸减小到512×512和256×256
  • 使用draw_texture扩展
  • 禁用混合
  • 将纹理过滤从GL_LINEAR更改为GL_NEAREST
  • 使用VBOs(绝望的尝试,因为只有三个四边形…)
  • 在独立活动中运行绘图代码(如果某个活动壁纸会影响性能)

如果我画2层而不是3层,fps上升到45左右,然后画1层看到fps上升到55.我想我受限于填充率,因为closures和潜在的昂贵的function导致相同的FPS,而似乎改善FPS的唯一的东西只是画less…

我正在考虑纹理压缩的想法,但支持不同的压缩格式似乎并不好玩。 ETC1没有我需要的alpha通道,我不确定是否PVRTC和ATITC甚至可以从Java和OpenGL ES 1.0或1.1中使用。

我很乐意听到有关其他方面的想法。 如果有用的话,我可以指出当前版本的壁纸和截图。

Solutions Collecting From Web of "提高Android上OpenGL ES填充率的技巧"

你可能已经想到了这一点,但以防万一你没有:

  • 调用glClear在你的框架开始可能是没有必要的
  • 你可以做第一遍禁用混合

另外,你是否尝试过使用多纹理方法进行一次传球?

编辑:另一件事:写入到z缓冲区是不需要的,所以要么使用没有z缓冲区的上下文,要么用glDepthMask(GL_FALSE)禁用深度写入。

glCompressedTexImage2D在Java(和NDK)中可用,但可用的压缩格式取决于GPU。

AndroidManifest.xml文件> supports-gl-texture

  • PowerVR SGX – Nexus S,Galaxy S / Tab,DROID – PVRTC
  • Adreno – Nexus One,EVO – ATITC
  • Tegra2 – Xoom,Atrix – S3TC

如果您使用这些压缩格式并希望支持各种Android设备,则必须准备许多压缩纹理,但是GPU原生压缩纹理应该可以提高渲染性能。

  • GPU分析和OpenGL ES中的callback
  • OpenGL ES,将纹理格式从RGBA8888更改为RGBA4444可以提高填充率?

android opengl框架min3d能够以60fps的速度绘制这些对象或场景。

该框架是开源的,可以在http://code.google.com/p/min3d/下载和使用。

我会build议比较你的代码,看看你做错了什么/不同的,以提高你的performance。