【问题标题】:Advice on speeding up OpenGL ES 1.1 on the iPhone在 iPhone 上加速 OpenGL ES 1.1 的建议
【发布时间】:2010-12-23 02:51:49
【问题描述】:

我正在开发一个严重依赖 OpenGL 的 iPhone 应用程序。现在它在 iPhone 3G 上运行有点慢,但在新的 32G iPod Touch 上看起来很流畅。我认为这是与硬件相关的。无论如何,我想让 iPhone 的性能类似于 iPod Touch 的性能。我相信我在 OpenGL 中做的很多事情都不是最理想的,我想请教一下哪些改进会给我带来最大的收益。

我的场景渲染是这样的:

  • 重复 35 次
    • glPushMatrix
    • glLoadIdentity
    • gl翻译
    • 重复 7 次
      • glBindTexture
      • glVertexPointer
      • glNormalPointer
      • glTexCoordPointer
      • glDrawArrays(GL_TRIANGLES, ...)
    • glPopMatrix

我的顶点、法线和纹理坐标已经交错了。

那么,我应该采取哪些步骤来加快速度?你会先尝试哪一步?

我的第一个想法是使用纹理图集来消除所有那些 glBindTexture() 调用。

一些更有效的矩阵运算呢?我知道 gl*() 版本效率不高。

VBO 呢?

更新

有 8260 个三角形。 纹理大小为 64x64 png。有 58 种不同的纹理。

我没有运行仪器。

更新 2

在 iPhone 3G 上运行 OpenGL ES Instrument 后,我​​发现我的 Tiler Utilization 在 90-100% 范围内,而我的 Render Utilization 在 30% 范围内。

更新 3

纹理图集对该问题没有明显影响。使用范围仍如上文所述。

更新 4

将我的 Vertex 和 Normal 指针转换为 GL_SHORT 似乎提高了 FPS,但 Tiler Utilization 在很多时候仍处于 90% 的范围内。我仍在使用 GL_FLOAT 作为纹理坐标。我想我可以将它们降低到 GL_SHORT 并为每个顶点节省四个字节。

更新 5

将我的纹理坐标转换为 GL_SHORT 产生了另一个性能提升。我现在一直获得> 30 FPS。瓷砖利用率仍然在 90% 左右,但经常下降到 70-80% 的范围内。渲染器利用率徘徊在 50% 左右。我想这可能与从 GL_TEXTURE 矩阵模式缩放纹理坐标有关。

我仍在寻求更多改进。我希望接近 40 FPS,因为这就是我的 iPod Touch 所获得的,而且它在那里如丝般顺滑。如果有人还在关注,我还能摘什么低调的果实?

【问题讨论】:

  • 你有多少个三角形?你的纹理有多大?第一个问题是您是否根据几何数量、正在处理的像素数量或主机 CPU 达到限制。您是否尝试过使用 Instruments 来分析 CPU 或 GPU?
  • 是的,32 位。怎么去RGB565?我使用 GIMP 来创建我的纹理图集,如果这有什么不同的话。
  • 请参阅下面关于 RGB565 和 PVRTC 的新答案

标签: iphone opengl-es


【解决方案1】:

如果 tiler 利用率仍高于 90%,您可能仍受顶点吞吐量限制。您的渲染器利用率更高,因为 GPU 正在渲染更多帧。如果您的主要重点是提高旧设备的性能,那么关键仍然是减少每个三角形所需的顶点数据量。这有两个方面:

减少每个顶点的数据量:现在您的所有顶点属性都已经是GL_SHORTs,接下来要做的就是找到一种方法来使用更少的属性或成分。例如,如果您可以在没有镜面高光的情况下生活,使用 DOT3 照明代替 OpenGL ES 固定功能照明将用 2 条短裤代替法线的 3 条短裤(+ 1 条填充)以获得额外的纹理坐标。作为额外的奖励,您可以按像素点亮模型。

减少每个三角形所需的顶点数:使用索引三角形绘制时,应确保对索引进行排序以最大限度地重复使用。通过 Imagination Technologies 的 PVRTTriStrip 工具运行几何图形可能是您最好的选择。

【讨论】:

  • 什么是 DOT3 照明。我很难找到一个体面的定义。
  • 我决定将此标记为最佳答案,因为它触及了问题的核心:被推送到 OpenGL 的数据大小。
【解决方案2】:

如果您只有 58 个不同的 64x64 纹理,那么纹理图集似乎是个好主意,因为它们都适合单个 512x512 纹理...如果您不依赖纹理环绕模式,我当然会至少试试这个。

你的纹理是什么格式的?您可以尝试使用压缩的 PVRTC 纹理;我认为这对 Tiler 的负载较小,即使对于每像素 2 位的纹理,图像质量也让我感到惊喜。 (适用于自然图像,如果您正在做一些看起来像 8 位视频游戏的东西,则不好)

【讨论】:

  • 它们是 png。我不依赖纹理环绕模式。
  • @Rob Jones:他的意思是它们以什么格式存储在 VRAM 中而不是磁盘中。 GL_RGBGL_RGBAGL_LUMINANE_ALPHA
【解决方案3】:

我要做的第一件事是在速度较慢的硬件设备上运行 Instruments 分析。它应该会很快向您显示特定案例的瓶颈所在。

仪器结果后更新:

This question 在 Instruments 中与您有类似的结果,也许该建议也适用于您的情况(基本上减少顶点数据数)

【讨论】:

  • 是的,我在使用 Instruments 并试图理解它告诉我的内容后看到了这一点。一旦确定哪些建议是相关的,我将尝试相关建议。
  • 这个讨论是相当繁重的 :) 至少你有一条路要走。
  • 是的,我也这么认为。我正在使用 GL_FLOAT。我将尝试将一些顶点属性移动到 GL_SHORT 或 GL_BYTE。
  • 我是提出这个问题的人,而产生最大差异的相关调整是从 GL_FLOAT 到 GL_SHORT。如果操作正确,您的 3-D 模型不会丢失分辨率,而且我看到仅此一项渲染性能就提高了 30%。
  • @Brad,我尝试转到 GL_SHORT,但在渲染视图时对象不可见。如上所述,我正在所有三个轴上执行 glTranslates()。我在其他地方看到了一条评论,暗示这可能会导致问题,尽管评论者没有具体说明问题。也许我会将这一切作为一个新问题发布。
【解决方案4】:

图形编程的最大胜利归结为:

批次,批次,批次

TextureAtlasing 将比您可以做的大多数其他事情产生更大的影响。切换纹理就像让一辆超速的火车每次都让新乘客上车。

将所有这些纹理组合成一个图集,大大减少你的绘制调用。

这个基于网络的工具可能会有所帮助:http://zwoptex.zwopple.com/

【讨论】:

    【解决方案5】:

    您是否查看过开发中心的“iPhone OS OpenGL ES 编程指南”?有关于顶点数据和纹理数据的最佳实践的部分。

    您的数据是否已格式化为能够使用三角形条带?

    就最省力而言,您的修改顺序可能是:

    • 减小顶点属性大小
    • VBO

    请注意,当您执行这些操作时,您需要确保组件在其本机对齐方式上对齐,即浮点数或完整整数在 4 字节边界上,短裤在 2 字节边界上。如果你不这样做,它会影响你的表现。通过将属性排序输入为结构定义来进行心理映射可能会有所帮助,这样您就可以检查布局和对齐方式。

    • 确保您的数据被剥离以共享顶点
    • 使用纹理图集减少纹理交换

    【讨论】:

      【解决方案6】:

      要尝试将纹理转换为 16 位 RGB565 格式,请参阅 Apple 古老的 Texture2D.m 中的此代码,搜索 kTexture2DPixelFormat_RGB565

      http://code.google.com/p/cocos2d-iphone/source/browse/branches/branch-0.1/OpenGLSupport/Texture2D.m

      (此代码在创建纹理时加载 PNG 并将其转换为 RGB565;我不知道是否有这样的 RGB565 文件格式)

      有关 PVRTC 压缩纹理的更多信息(使用它们时看起来比我预期的要好得多,即使是每像素 2 位),请参阅 Apple 的 PVRTextureLoader 示例:

      http://developer.apple.com/iPhone/library/samplecode/PVRTextureLoader/index.html

      它既有在应用中加载 PVRTC 纹理的代码,也有使用纹理工具将 .png 文件转换为 .pvr 文件的说明。

      【讨论】:

      • 看起来这并没有影响我的 FPS,但它使内存占用减少了半兆。感谢您的提示。我可能还会看 PVRTC。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      相关资源
      最近更新 更多