【问题标题】:Optimal 2D tiling method最佳二维平铺方法
【发布时间】:2013-01-21 06:53:27
【问题描述】:

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

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

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

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

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

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

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

非常感谢!

【问题讨论】:

    标签: java android opengl-es


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复!我相信 VBO 是要走的路,所以我会听取你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2017-10-27
    相关资源
    最近更新 更多