最佳二维平铺方法

时间:2013-01-18 20:35:36

标签: java android opengl-es

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

快速而且重要的是,我目前有一些基于Canvas的游戏(它真的不像人们说的那么糟糕,我在1到10秒的CPU上获得30-40的FPS)并且性能很好,但我有一些新的想法,我认为OpenGL是获得表现我令人眼花缭乱的特效所需的表现的唯一方法。

我有一个GameEngine有几千个小时,所以我有点抵制做出巨大的架构改变只是为了“测试”我可以避免它的东西(特别是因为我是OpenGL的新手并且可以'花了一个月的时间来获得最佳表现(时间=金钱)。

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

所以我在屏幕上有大量的瓷砖/瓷砖层,每个框架都需要重新绘制。会不会更好:

  1. 解析我的关卡文件并将每个平铺转换为链接到其兄弟姐妹等的多边形(四边形),并在加载时为其创建一个UV贴图? (这需要进行体系结构更改,将每个图块存储为矩形,以跟踪相邻图块的点,以便它们可以链接)。
  2. 创建一个QUAD并将其围绕屏幕移动到所有位置,注意渲染可以使用SAME纹理在同一个通道上渲染的图块。
  3. 为每个图块创建一个QUAD,并在每个图块上调用draw()方法(仍然确保将textureswaps保持在最小或完全消失)。
  4. 要在屏幕上重新定位一个对象,我应该glTranslate(我明白这会对GPU施加压力)还是更新更新保存QUAD坐标的FloatBuffer会不会更好?

    非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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

最后,对于更新顶点位置缓冲区的问题,这也是一个依赖于平台的解决方案,但是,无论如何都要指出使用顶点缓冲区对象(VBOs) 。几乎所有移动GPU都将以这种方式存储顶点数据。

相关问题