7

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

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

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

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

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

这里有更多信息:

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

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

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

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

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

谢谢你。

4

6 回答 6

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

如果您可以发布一些绘图代码,那么帮助您会容易得多。

于 2009-01-13T19:21:57.463 回答
5

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

于 2009-01-13T17:57:51.360 回答
3

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

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

于 2009-03-20T16:44:19.987 回答
1

我对OpenGL ES没有太多经验,但是这个问题通常会发生。

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

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

于 2009-01-13T00:02:12.500 回答
0

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

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

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

于 2009-01-13T14:26:35.313 回答
0
  1. 您可以使用类似于 Apple 的 GLPaint 示例的帧缓冲区对象。
  2. 使用纹理图集可以最大限度地减少绘制调用的次数。您可以使用 glTexCoordPointer 设置将每个图像映射到其正确位置的纹理坐标。记住也要设置你的顶点缓冲区。理想情况下,一次绘制调用将渲染您的整个 2D 场景。
  3. 尽可能避免启用/禁用状态。
于 2009-03-06T12:42:25.117 回答