最小化OpenGl中的glDrawArray调用

时间:2010-06-29 08:38:14

标签: iphone opengl-es

我想听听人们认为Open GL ES(在iphone上)的最佳绘图调用。

具体来说,我在很多地方都读过,最好尽量减少对glDrawArrays / glDrawElements的调用次数 - 我认为Apple认为10应该是他们最近的WWDC演示中的最大值。据我所知,如果可能的话,你需要将所有顶点放在一个数组中,所以你只需要调用一次drawArrays。

但我很困惑,因为这肯定意味着你无法使用平移,旋转,缩放功能,因为它将适用于整个几何体。哪个很好,除非这意味着你需要自己预先计算每个顶点位置,而不是开放gl来做它?

此外,这并不代表您不能使用任何风扇/条带设置,除非您只是连续的形状?

这些缺点让我觉得我不能正确理解某些东西,所以我想我正在寻找确认我应该:

  • 尝试制作所有三角形的超级数组。
  • 让我自己承认我必须自己解决所有顶点位置。
  • 忘记推送和弹出每件东西以吸引它的理想位置

那是别人做的吗?

由于

1 个答案:

答案 0 :(得分:8)

很大的问题,批处理总是妥协的问题。

正如您所提到的,性能的理想结构将是包含要绘制的所有三角形的单个数组。

从这里开始,我们可以开始添加约束:

  • 另外一个限制是 具有16位的顶点索引可以节省 带宽和内存,可能 您平台的快速路径。所以 你可以考虑分组三角形 在65536个顶点的块中。

  • 然后,如果你想切换 shader / material / glState用于绘制 几何,你别无选择(*)但是 每次发出一次平局调用 着色器/材料/ glState。所以分组 三角形可以考虑分组 shaderID / materialID / glStateID。

  • 接下来,如果你想动画一下, 你别无选择(*)但是 将变换矩阵传输到GL, 然后发出一个平局调用。所以 分组三角形可以考虑 通过'变换对三角形进行分组 例如,所有静态组 几何图形,动画几何图形 有共同变换的可以 分组也是如此。

在这些情况下,在将网格合并在一起之前,您必须自己(使用CPU)变换顶点。

关于三角形条带,您可以通过引入简并三角形来转换条带中的任何网格,即使它的拓扑中存在不连续性。所以这是一种始终适用的技术。

总而言之,减少绘制调用是一种妥协的游戏,某些技术可能适用于3D模型,而其他技术可能更适合其他3D模型。恕我直言,关键是要有创意,并仔细评估您的应用程序,看看您的更改是否真正提高了目标平台的性能。

HTH,干杯,


(*)实际上有些技术可以减少这些情况下的绘制调用次数,例如:

  • texture atlases将不同的纹理组合在一起,以防止 因此,在GL中切换纹理 允许限制绘制调用

  • (伪)硬件实例化,允许着色器获取变换 从各种渠道转变 网格实例以不同的方式。

  • ...