0

我对 OpenGL ES 2.0 有点困惑,我找不到有关处理 2D 平铺的正确过程的任何权威信息(或者我有但我不明白)。

言简意赅,我目前有一些基于 Canvas 的游戏(它真的没有人们说的那么糟糕,我在 1GHz CPU 上获得 30-40 之间的 FPS)并且性能很棒,但我有一些新的想法和我认为 OpenGL 是获得展示我令人眼花缭乱的特效所需的性能的唯一方法。

我有一个包含数千小时的游戏引擎,所以如果我可以避免它,我有点抗拒为了“测试”事情而进行巨大的架构更改(特别是因为我是 OpenGL 的新手并且买不起花一个月的时间获得最佳性能(时间=金钱)。

我知道纹理切换非常昂贵。并且已经有一个系统可以将纹理区域保持在单个纹理上。我还跟踪屏幕上的对象,因此只有显示场景所需的绘制调用才会发送到 GPU。

所以我在屏幕上有大量的瓷砖/瓷砖层,每帧都必须重新绘制。是否会更好:

  1. 解析我的关卡文件并将每个图块转换为与其兄弟姐妹等链接的多边形(四边形),并在加载时为其创建 UV 贴图?(这将需要从将每个图块存储为矩形到跟踪相邻图块的点以便可以链接它们的架构更改)。
  2. 创建一个 QUAD 并将其在屏幕周围移动到所有位置,注意渲染可以使用相同纹理在同一通道上渲染的图块。
  3. 为每个图块创建一个 QUAD,然后在每个图块上调用 draw() 方法(仍然确保将纹理交换保持在最低限度或完全消失)。

要在屏幕上重新定位对象,我应该 glTranslate(我知道这会对 GPU 施加压力)还是更新保存 QUAD 坐标的 FloatBuffer 会更好?

万分感谢!

4

1 回答 1

0

首先,如果您使用的是 OpenGL ES 2.0,则 glTranslate() 不可用;它仅在 OpenGL ES 1.X 中受支持。

性能最佳的解决方案将取决于您使用的平台。特别是,GPU 的底层图形架构(无论是即时渲染系统还是平铺渲染系统)将决定您可以在场景中避免多少次绘制调用。因为 OpenGL ES 没有四边形图元(例如,GL_QUADS,您可以在桌面 OpenGL 的兼容性配置文件中使用),您要么需要绘制一系列三角形对(每个三角形条带,每个都需要自己绘制调用),或者作为独立三角形的集合,每对三角形组成一个四边形(这种模式转换更多位置,但减少了绘制调用的数量),或者如果你可以在你的 1. 建议中做,并跟踪所有将使用相同纹理的四边形,您可以绘制一个带有退化三角形的长三角形条(面积为零的三角形,不会被光栅化到屏幕上)。这将需要更多的几何工作,但可以减少您需要进行的纹理交换量。

最后,对于更新顶点位置缓冲区的问题,这也是一个依赖于平台的解决方案,但是,不管使用顶点缓冲区对象(VBO)。几乎所有移动 GPU 都将从以这种方式存储您的顶点数据中受益。

于 2013-01-20T22:53:27.953 回答