在Android上提高OpenGL ES填充率的提示

时间:2011-03-02 09:19:26

标签: android performance opengl-es textures

在我的动态壁纸中,我正在绘制3个纹理四边形,覆盖整个屏幕。在Nexus One上我得到40fps。我正在寻找提高绩效的方法。

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

我有

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:

  • 将纹理大小减小到512x512和256x256
  • 使用draw_texture扩展名
  • 禁用混合
  • 将纹理过滤从GL_LINEAR更改为GL_NEAREST
  • 使用VBO(绝望的尝试,因为只有3个四边形......)
  • 在独立活动中运行绘图代码(如果是动态壁纸会以某种方式影响性能)

如果我绘制2层而不是3层,则fps上升到45左右, 然后只绘制1层,看到fps上升到55.我想我受到填充率的限制,因为关闭和可能代价高昂的功能导致相同的fps,而且似乎唯一可以提高fps的是...

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

我很高兴听到关于还有什么可尝试的想法。 我可以指示当前版本的壁纸和屏幕截图(如果有用)。

3 个答案:

答案 0 :(得分:5)

你可能已经想过这个,但万一你没有:

  • 在你的帧开始时调用glClear可能没有必要
  • 您可以执行第一次禁用混合

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

编辑:另外一件事:不需要写入z缓冲区,因此要么使用没有z-buffer的上下文,要么使用glDepthMask(GL_FALSE)禁用深度写入。

答案 1 :(得分:3)

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

The AndroidManifest.xml File > supports-gl-texture

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

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

答案 2 :(得分:1)

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

该框架是开源的,可以在http://code.google.com/p/min3d/

下载和使用

我建议您将代码与其进行比较,以便了解您的错误/不同之处,以提高效果。