2

我正在使用 OpenGL ES 开发一款适用于 Android 的游戏,但遇到了性能问题。

我正在尝试做的事情:我在屏幕上有一堆对象,它们都共享相同的网格,但都有单独的旋转和平移。你可以把它比作小行星,你有一堆小行星在屏幕上四处移动。

实际问题:我的性能受到了影响,因为我单独旋转和平移每个对象,并且与顶点数量(每个对象数十个)相比,发送顶点数组的开销太大。

我能做些什么?我想到的一种解决方案是自己更新软件中的顶点,然后再将它们放入顶点缓冲区。这可能会为我节省一些开销,但这似乎违反直觉。

请分享您可能有的任何想法或建议!谢谢!

4

1 回答 1

1

“发送顶点数组的开销”似乎暗示您没有为顶点/索引使用服务器端缓冲区。如果是这种情况,请查看 GLES 1.1 规范的第 2.9 节“缓冲区对象”。

当然,即使您使用服务器端缓冲区,足够多的小glDrawElements调用也很容易成为性能瓶颈。

如果你所有的对象都是静态的,你可以只预先转换它们并支付 Nx 服务器上的内存。

如果你的对象是动态的,事情就会变得更加棘手。“实例化”绘图(例如,参见 Direct-X's DrawInstanced)可能会有所帮助,但我不相信 GLES 有类似的东西(“实例化”绘图也会在静态情况下节省内存)。

使用 GLES 2.0,您可以尝试以下操作:

  • 将 M 个网格副本放入顶点缓冲区,为每个顶点提供一个附加属性,该属性是副本的索引
  • 在顶点着色器中,从一个统一数组中加载变换矩阵(或它的一个子部分,如果其中一些是固定的),由附加属性索引

然后你可以进行 N/MglDrawElements调用,每次都在统一数组中设置 M 个矩阵。目前尚不清楚这实际上是否会更快,因为(一方面)硬件必须更努力地工作(索引制服不是超级便宜)。另外,我认为在 GLES 1.1 中不可能有这样的事情。

于 2010-09-28T03:20:56.080 回答