gpt4 book ai didi

iphone - 最小化 OpenGl es 中的 glDrawArray 调用

转载 作者:行者123 更新时间:2023-12-03 19:33:53 26 4
gpt4 key购买 nike

我想听听人们认为 Open GL ES(在 iPhone 上)的最佳绘制调用是什么。

具体来说,我在很多地方读到,最好尽量减少对 glDrawArrays/glDrawElements 的调用次数 - 我认为 Apple 在最近的 WWDC 演示中说 10 应该是最大值。据我了解,要做到这一点,如果可能的话,您需要将所有顶点放入一个数组中,因此您只需要调用一次drawArrays。

但我很困惑,因为这肯定意味着你不能使用平移、旋转、缩放函数,因为它将应用于整个几何体。这很好,但这是否意味着您需要自己预先计算每个顶点位置,而不是让 open gl 来完成它?

此外,这是否意味着除非您只有连续的形状,否则您不能使用任何扇形/条形设置?

这些缺点让我觉得我没有正确理解某些东西,所以我想我正在寻找我应该这样做的确认:

  • 尝试创建一个包含所有要绘制的三角形的 super 数组。
  • 接受这样的事实:我必须自己计算出所有顶点位置。
  • 忘记插入和弹出每个东西以将其绘制到所需的位置

别人也是这么做的吗?

谢谢

最佳答案

大问题,批处理始终是一个妥协的问题。

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

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

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

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

  • 接下来,如果您想要为事物设置动画,你别无选择 (*) 只能将您的变换矩阵传输到 GL,然后发出绘制调用。所以分组三角形可以考虑通过“变换”对三角形进行分组groups',例如,所有静态的几何在一起,动画几何具有共同变换的可以是也分组。

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

关于三角形 strip ,您可以通过引入简并三角形来变换 strip 中的任何网格,即使它的拓扑结构不连续。所以这是一项始终适用的技术。

总而言之,减少绘制调用是一个妥协的游戏,某些技术可能适用于 3d 模型,而其他技术可能更适合其他 3d 模型。恕我直言,关键是要有创造力,并仔细对您的应用程序进行基准测试,看看您的更改是否确实提高了目标平台上的性能。

HTH,干杯,

<小时/>

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

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

  • (伪)硬件实例允许着色器获取变换从各种来源进行改造网格实例以不同的方式。

  • ...

关于iphone - 最小化 OpenGl es 中的 glDrawArray 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3139068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com