【问题标题】:glDrawElements extremally slow on Android ( HTC Wildfire )glDrawElements 在 Android 上非常慢(HTC Wildfire)
【发布时间】:2011-08-07 18:53:35
【问题描述】:

我正在 Android 手机(确切地说是 HTC Wildfire)上测试 OpenGL 性能,我遇到了一件奇怪的事情 - 当我尝试绘制一个屏幕大小的带纹理的索引矩形 (320 x 480) 时,我帧率最高可达 40 fps!!! - 只有当我使用 32x32 纹理时。

如果我将纹理大小增加到 256x256,性能下降到 35 帧。

我的问题是 - 所有这些 Android 游戏如何能够流畅运行,并且仍然充满了酷炫的图形。

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    有很多不同的方法可以让您的设备发挥性能。

    1. 确保您没有进行不需要的混合或绘图,并且根据经验,许多低端 HTC 设备(例如欲望)都受到填充率的限制。
    2. 使用三角形条代替三角形。
    3. 使用绘图元素并缓存您的调用,例如加载您的顶点缓冲区并为一帧多次调用绘图。

    但最重要的是使用带有方法分析的 DDMS 来确定您的瓶颈实际在哪里,它们可能是您意想不到的地方,例如日志记录、gc、循环中的缓慢操作。您将能够看到有多少时间用于渲染以及多少时间用于其他操作。 (寻找 GLImpl.glDrawElements)

    我最大的问题是 GC 启动太频繁(每秒 5 次,导致我的 fps 非常缓慢),你会在内存分配中经常看到你甚至不会想到的地方。例如,如果您使用 + 运算符将字符串连接到浮点数,或者在任何地方使用传统的 java get() 函数或(最差的)集合,这些都会创建大量可以触发 GC 的对象。

    此外,如果您有昂贵的操作,请将它们分离到单独的线程中。

    另外,我假设您只创建一次纹理,并且每次都使用相同的索引。我看过一些教程,它们会在每次渲染一帧时创建纹理。

    通过广泛使用 DDMS,我能够在 HTC Desire 上将 fps 从 12 提高到 50,以应对繁忙的场景。

    希望这能让你朝着正确的方向前进 :)

    【讨论】:

    • 就像我提到的,我正在测试性能 - 所以我只使用一个加载并绑定到设备一次的纹理,然后我只是使用 GL10 绘制两个索引三角形。 GL_TRIANGLES 调用 - 仅此而已。问题是这两个三角形覆盖了整个屏幕。所以让我担心的是,将屏幕大小的纹理简单地传送到后台缓冲区会花费太多
    • 嗨 Paksas 我目前正在使用数十个 128x128 纹理以及 AI、碰撞检测和其他一些事情,我能够达到 40 - 50 fps 的 HTC 愿望。目前我 80% 的渲染时间都花在了绘制菜单和调试信息上,这是在使用自定义字符串处理程序大量优化所有 GC 操作之后(我的 DrawNumber 函数仅占 31%)。如果您发布您的代码,我们可以查看它,但我仍然强烈建议使用方法分析器和分配跟踪器来查看您的应用程序在渲染之前是否在任何地方等待。
    • 其实直接比较设备,从android store免费运行Smartbench 2011,比较数值。渴望得到 1134 的 cpu 和 546 的图形。那应该给我们一个设备之间的相对比例。
    【解决方案2】:

    根据我自己的经验,它们不会在野火之类的设备上使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多