题
我正在使用OpenGL ES为iPhone开发2D游戏,我想使用320x480位图图像作为持久背景。
我的第一个想法是创建一个320x480四边形,然后将纹理映射到代表背景的纹理上。所以...我创建了一个512x512纹理,上面有320x480图像。然后我将其映射到320x480四核。
我每帧都画这个背景,然后在它上面绘制动画精灵。除了绘制所有这些对象(背景+精灵)太慢之外,这种方法很好。
我做了一些测试,发现我的减速是在像素管道中。毫不奇怪,大背景图像是罪魁祸首。为了证明这一点,我删除了背景绘制,其他所有内容都非常快速地呈现。
我正在寻找有关如何保持背景并提高性能的建议。
以下是更多信息:
1)我目前正在模拟器上进行测试(仍在等待Apple获取许可证)
2)背景是PVR纹理压缩到128k
3)我原本希望有一种方法可以将这个背景缓存到一个颜色缓冲区中,但是没有任何运气。这可能是由于我对OpenGL ES缺乏经验,或者它可能是一个不起作用的愚蠢想法:)
4)我意识到整个背景并不总是必须刷新,只是被移动的精灵所绘制的部分。我开始研究用于刷新(根据需要)背景部分的技术,可以是单独的纹理,也可以是剪刀盒,但这似乎不太优雅。
非常感谢任何提示/建议......
谢谢。
解决方案 3
感谢所有提供此信息的人。所有的建议都以这种或那种方式得到了帮助。
但是,我想清楚地说明这里的主要问题是模拟器本身的行为(正如Andreas在他的回答中所暗示的那样)。一旦我能够在设备上获得应用程序,它就会表现得更好,更好。我提到这一点是因为,在开发我的游戏之前,我看过很多帖子表明该设备比模拟器慢得多。在某些情况下(例如通用应用程序逻辑)可能会出现这种情况,但根据我的经验,设备上的动画(尤其是3d变换)要快得多。
其他提示
- 不要在模拟器上进行性能测试。永远!点击 与真实硬件的差异很大。在两个方向。
- 如果你每帧画出背景:
不要清除帧缓冲区。无论如何,背景会透支整个事情。 - 你真的需要背景纹理吗?
如何通过顶点颜色使用颜色渐变? - 尝试使用2位模式进行纹理处理。
- 转动背景不需要的所有渲染步骤。
例如:照明,混合,深度测试,......
如果您可以发布一些绘图代码,那么帮助您会容易得多。
如果你正在制作2D游戏,你有没有理由不使用现有的图书馆?具体来说,iPhone的cocos2d可能值得你花时间。我无法回答你关于如何解决这个问题的问题,但是我可以说我已经完成了你正在谈论的内容(在顶部有精灵的全屏幕背景)和cocos2d它的工作原理大。 (假设60 fps对你来说足够快。)你可能有理由自己做,但如果可以,我强烈建议至少用cocos2d做一个快速原型,看看这对你有帮助。 (iPhone版本的详细信息和来源如下: http://code.google.com/ p / cocos2d的-iphone / )
我对OpenGL ES没有太多经验,但一般会出现这个问题。
你对'色彩缓冲'的想法是很好的直觉,基本上你想要将你的背景存储为帧缓冲区并在绘制前景之前将它直接加载到渲染缓冲区。
在OpenGL中,帧缓冲对象(FBO)非常简单。不幸的是,我不认为OpenGL ES支持它们,但它可能会让你开始寻找。
您可能想尝试使用VBO(顶点缓冲区对象)并查看是否可以加快速度。教程是这里
另外,我刚看到,自 OpenGL ES v1.1 以来,是一个名为glDrawTex(绘制纹理)的函数,专为
设计快速渲染背景画,位图字体字形和游戏中的2D框架元素
- 您可以使用类似于Apple的GLPaint示例的帧缓冲区对象。
- 使用纹理图集来最小化您进行的绘制调用次数。您可以使用glTexCoordPointer设置将每个图像映射到正确位置的纹理坐标。记得也要设置顶点缓冲区。理想情况下,一次绘制调用将渲染整个2D场景。
- 尽可能避免启用/禁用状态。 醇>