【问题标题】:Drawing many textured squads OpenGL ES 2.0绘制许多纹理小队 OpenGL ES 2.0
【发布时间】:2017-02-04 23:05:59
【问题描述】:

我正在编写一个绘制网格的 Android 应用程序,您可以四处移动并朝其方向移动。网格由大约 2000 到 5000 个四边形组成,每个四边形都有不同的纹理。我定义了 4 个顶点并使用索引缓冲区来绘制每个四边形。在绘制之前,我使用模型矩阵定位它。正如您可以在我的场景中移动一样,我使用视锥体剔除,这在某些情况下会提高性能。不幸的是,我可能需要绘制所有的四边形,所以我想问一下如何防止缓慢绘制。

我不能使用纹理图集,因为所有纹理都非常大(从 256x256 到 1024x1024)。我认为为每个小队调用 glDrawElements() 会让我变慢,但我不知道如何改变它。

我的另一个想法是将场景绘制到纹理上,然后将此纹理绑定到单个四边形,以创建正在绘制的场景的错觉。随着用户越来越近,我可以重新绘制它以获得更好的分辨率。这行得通吗?

我期待任何形式的帮助。

【问题讨论】:

  • 准备一批使用相同纹理的四边形以减少开销。
  • 256x256x4 x 2000 = ~524MB。你没有提到任何关于 mipmap 的内容,但是,为了接近合理的帧速率,你可能需要它们,因为对于大多数移动 GPU 来说,这太多的数据无法处理。

标签: java android performance opengl-es drawing


【解决方案1】:

我不能使用纹理图集,因为所有纹理都非常大(从 256x256 到 1024x1024)。

您可以将 64 个 256x256 纹理放入 2048x2048 的图集,这是一个巨大的数量,因此您绝对应该使用图集。即使将 4 个 1024x1024 放到 2048x2048 上也是值得的,它可以使您的绘图调用次数减半。

正如 WLGfx 在 cmets 中对您的问题所说的那样,您应该批量处理使用相同纹理的所有四边形(使用 atlasing 将会有更多这样的四边形)。

我认为这已经足够了,但在完全缩小的视图中,您仍然可能有相当高的 drawcall 计数。在实现了图集和批处理之后,如果此处的性能仍然存在问题,您可以创建一个单独的缩略图资源集,例如,四分之一分辨率(因此 256x256 变为 64x64)。此缩略图资源集仅适用于少数 2048x2048 地图集,当缩小到足够远时您可以切换到它。

我的另一个想法是将场景绘制到纹理上,然后将此纹理绑定到单个四边形,以创建正在绘制的场景的错觉。随着用户越来越近,我可以重新绘制它以获得更好的分辨率。这行得通吗?

只要您的场景非常静态,如果四边形每帧都在移动/更改,那么这可能会起作用,那么它可能无济于事。此外,当您必须进行完全重绘时,可能会出现明显的帧速率问题。

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多