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

Pēt*_*une 8 performance android textures opengl-es

在我的动态壁纸中,我正在绘制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);
Run Code Online (Sandbox Code Playgroud)

我尝试过的东西,都产生了相同的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中使用.

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

svd*_*ree 5

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

  • 可能没有必要在帧的开头调用glClear
  • 你可以做第一次禁用混合

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

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

  • 在平铺GPU上的OpenGL ES通常会依赖glClear作为提示,它应该避免在渲染之前将帧缓冲区重新加载到tile内存中.在帧开始时不清除帧缓冲可能会严重影响这些设备的性能,因此如果您没有充分的理由放弃glClear,最好将其保留. (8认同)