【问题标题】:Tips for improving OpenGL ES fill rate on Android在 Android 上提高 OpenGL ES 填充率的技巧
【发布时间】:2011-07-07 03:11:45
【问题描述】:

在我的动态壁纸中,我绘制了 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 中使用。

我很高兴听到有关其他尝试的想法。 如果有用,我可以指点当前版本的壁纸和屏幕截图。

【问题讨论】:

    标签: android performance opengl-es textures


    【解决方案1】:

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

    • 可能不需要在帧开始时调用 glClear
    • 您可以在禁用混合的情况下进行第一遍

    另外,您是否尝试过使用多纹理方法一次性完成?

    编辑:还有一件事:不需要写入 z-buffer,所以要么使用没有 z-buffer 的上下文,要么使用 glDepthMask(GL_FALSE) 禁用深度写入。

    【讨论】:

    • 用 glClear 清除与不清除帧对我来说不会影响 fps。启用/禁用混合也没有。我会研究多纹理,谢谢!
    • 平铺 GPU 上的 OpenGL ES 通常依赖调用 glClear 作为提示,它应该避免在渲染之前将帧缓冲区重新加载到平铺内存中。在帧开始时不清除帧缓冲区会严重影响此类设备的性能,因此如果您没有充分的理由放弃 glClear,最好将其保留。
    • 设置 glDepthMask(GL_FALSE) 是不可能的,因为 glDepthMask 方法需要一个布尔值,我尝试了 glDepthMask(false),它就像一个魅力!
    【解决方案2】:

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

    The AndroidManifest.xml File > supports-gl-texture

    • PowerVR SGX - Nexus S、Galaxy S/Tab、DROID - PVRTC
    • 肾上腺 - Nexus One,EVO - ATITC
    • Tegra2 - Xoom、Atrix - S3TC

    如果你使用这些压缩格式,想要支持各种Android设备,你必须准备很多压缩纹理,但是GPU原生压缩纹理应该会提高渲染性能。

    【讨论】:

    • 我用 ETC1 做了一个快速测试。没有 alpha 但那很好——只是想看看使用压缩纹理是否可以提高填充率。似乎没有:在彼此之上绘制三个全屏四边形会产生相同的 40fps。我猜这是 N1 的 GPU 的性能限制,我对此无能为力......
    • 用 ATITC 代替 ETC1 怎么样? MOTODEV - Understanding Texture Compression 就我的经验而言,使用 PVRTC 可以提高 PowerVR SGX 的渲染性能。
    【解决方案3】:

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

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

    我建议将您的代码与它进行比较,以了解您做错了什么/不同之处,以提高您的性能。

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2020-07-29
      • 2014-01-27
      相关资源
      最近更新 更多