【问题标题】:Performance and background images for OpenGL ES/iPhoneOpenGL ES/iPhone 的性能和背景图像
【发布时间】:2009-01-07 20:37:26
【问题描述】:

我正在使用 OpenGL ES 为 iPhone 开发 2D 游戏,我想使用 320x480 位图图像作为持久背景。

我的第一个想法是创建一个 320x480 的四边形,然后在其上映射一个代表背景的纹理。所以...我创建了一个 512x512 的纹理,上面有一个 320x480 的图像。然后我将其映射到 320x480 四边形。

我每帧都绘制这个背景,然后在其上绘制动画精灵。除了所有这些对象(背景+精灵)的绘制速度太慢之外,这很好用。

我做了一些测试,发现我的减速是在像素管道中。毫不奇怪,大背景图片是罪魁祸首。为了证明这一点,我删除了背景绘制,其他一切都渲染得非常快。

我正在寻求有关如何保持我的背景并提高绩效的建议。

这里有更多信息:

1) 我目前正在模拟器上进行测试(仍在等待 Apple 获得许可)

2) 背景是压缩到 128k 的 PVR 纹理

3) 我曾希望有一种方法可以将此背景缓存到颜色缓冲区中,但没有任何运气。这可能是由于我对 OpenGL ES 缺乏经验,或者这可能是一个愚蠢的想法,行不通:)

4) 我意识到整个背景并不总是需要刷新,只是被移动精灵绘制的部分。我开始研究刷新(根据需要)背景部分的技术,无论是作为单独的纹理还是使用剪刀框,但这似乎不够优雅。

任何提示/建议将不胜感激...

谢谢。

【问题讨论】:

  • 你是在模拟器上运行的还是在真机上运行的?

标签: iphone opengl-es


【解决方案1】:
  1. 不要在模拟器上进行性能测试。永远!
    与真实硬件的差异是巨大的。在两个方向。
  2. 如果您每帧都绘制背景:
    不要清除帧缓冲区。无论如何,背景都会透支整个事物。
  3. 您真的需要背景纹理吗?
    通过顶点颜色使用颜色渐变怎么样?
  4. 尝试对纹理使用 2 位模式。
  5. 关闭所有不需要的背景渲染步骤。
    例如:照明、混合、深度测试、...

如果你能发布一些你的绘图代码,帮助你会容易得多。

【讨论】:

  • 我只在模拟器上运行,因为这就是我现在所拥有的;)仍在等待苹果。另外,我没有清除帧缓冲区,关闭了效果,并尝试了 2 位纹理(看起来很糟糕)。正如你所建议的,我可能不得不以效果为背景。我在很多游戏中都看到了这一点。谢谢。
【解决方案2】:

如果您正在制作 2D 游戏,您是否有任何理由不使用现有库?具体来说,用于 iPhone 的 cocos2d 可能值得您花时间。我无法回答你关于如何自己解决问题的问题,但我可以说我已经用 cocos2d 完成了你所说的(有一个全屏背景,顶部有精灵)并且它有效伟大的。 (假设 60 fps 对您来说足够快。)您可能有自己的理由,但如果可以的话,我强烈建议您至少使用 cocos2d 做一个快速原型,看看这是否对您没有帮助。 (iPhone版的详细信息和来源在这里:http://code.google.com/p/cocos2d-iphone/

【讨论】:

  • 我更喜欢从头开始构建,只是为了获得额外程度的控制。也就是说;我一定会检查 cocoas2d。其中一个问题是,除了背景之外,我还有 10 多个同时出现在屏幕上的大型精灵。你用 cocoas2d 做过类似的事情吗?谢谢
【解决方案3】:

感谢为此提供信息的所有人。所有的建议都以一种或另一种方式有所帮助。

但是,我想明确指出,这里的主要问题是模拟器本身的行为(正如 Andreas 在他的回复中暗示的那样)。一旦我能够在设备上安装应用程序,它的性能就会好得多。我之所以提到这一点,是因为在开发我的游戏之前,我看到很多帖子表明该设备比模拟器慢得多。这在某些情况下可能是正确的(例如一般应用程序逻辑),但根据我的经验,动画(尤其是 3d 转换)在设备上要快得多。

【讨论】:

    【解决方案4】:

    我对OpenGL ES没有太多经验,但是一般都会出现这个问题。

    您对“颜色缓冲区”的想法很直观,本质上您希望将背景存储为帧缓冲区,并在绘制前景之前将其直接加载到渲染缓冲区中。

    在 OpenGL 中,这对于帧缓冲区对象 (FBO) 来说是相当直接的。不幸的是,我不认为 OpenGL ES 支持它们,但它可能会给你一个开始寻找的地方。

    【讨论】:

    • 这很奇怪...... OpenGL ES 1.0 似乎支持帧缓冲区对象扩展,但我无法确认该扩展在 iphone 上可用。我想我会测试一下并发布我的发现。谢谢。
    • 哎呀,澄清一下...支持帧缓冲区扩展。我需要测试的是创建第二个帧缓冲区,然后我会将纹理附加到。
    【解决方案5】:

    您可能想尝试使用 VBO(顶点缓冲区对象),看看是否可以加快速度。教程是here

    另外,我刚刚看到,从OpenGL ES v1.1开始,有一个叫做glDrawTex(Draw Texture)的函数是专为

    设计的

    在游戏中快速渲染背景绘画、位图字体字形和 2D 框架元素

    【讨论】:

    • 我实际上已经在使用 vbos 了。我遇到的瓶颈在于像素管道。我能够通过消除所有纹理并仅渲染线框来证明这一点。应用程序在此配置中运行得非常快。谢谢...
    【解决方案6】:
    1. 您可以使用类似于 Apple 的 GLPaint 示例的帧缓冲区对象。
    2. 使用纹理图集可以最大限度地减少绘制调用的次数。您可以使用 glTexCoordPointer 设置将每个图像映射到其正确位置的纹理坐标。记住也要设置你的顶点缓冲区。理想情况下,一次绘制调用将渲染您的整个 2D 场景。
    3. 尽可能避免启用/禁用状态。

    【讨论】:

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