我想听听人们认为Open GL ES(在iphone上)的最佳绘图调用.
具体来说,我已经在许多地方读过,最好尽量减少对glDrawArrays/glDrawElements的调用次数 - 我认为Apple认为10应该是他们最近的WWDC演示中的最大值.据我所知,如果可能的话,你需要将所有顶点放在一个数组中,所以你只需要调用一次drawArrays.
但我感到困惑,因为这肯定意味着你不能使用平移,旋转,缩放功能,因为它将适用于整个几何体.哪个很好,除非这意味着你需要自己预先计算每个顶点位置,而不是开放gl来做它?
此外,这不是说你不能使用任何风扇/条带设置,除非你只有一个连续的形状?
这些缺点让我觉得我不能正确理解,所以我想我正在寻找确认:
这是其他人做的吗?
谢谢
绝对的问题,批处理始终是妥协的问题.
如您所述,理想的性能结构将是包含要绘制的所有三角形的单个数组.
从这里开始,我们可以开始添加约束:
另外一个限制是,具有16位的顶点索引可以节省带宽和内存,并且可能是您平台的快速路径.因此,您可以考虑将三角形分组为65536个顶点.
然后,如果要切换用于绘制几何体的着色器/材质/ glState,则无法选择(*),而是为每个着色器/材质/ glState发出一次绘制调用.因此,分组三角形可以考虑按shaderID/materialID/glStateID进行分组.
接下来,如果要为动画制作动画,则无法选择(*),而是将变换矩阵传输到GL,然后发出绘制调用.因此,分组三角形可以考虑通过"变换组"对三角形进行分组,例如,将所有静态几何体组合在一起,具有共同变换的动画几何体也可以进行分组.
在这些情况下,在将网格合并在一起之前,您必须自己(使用CPU)转换顶点.
关于三角形条带,您可以通过引入简并三角形来转换条带中的任何网格,即使它的拓扑中存在不连续性.所以这是一种始终适用的技术.
总而言之,减少绘制调用是一种妥协的游戏,某些技术可能适用于3D模型,而其他技术可能更适合其他3D模型.恕我直言,关键是要具有创造性并仔细评估您的应用程序,看看您的更改是否真正提高了目标平台的性能.
HTH,欢呼,
(*)实际上有些技术可以减少这些情况下的绘制调用次数,例如:
纹理图集将不同的纹理组合在一个纹理中,以防止在GL中切换纹理,从而允许限制绘制调用
(伪)硬件实例化,允许着色器从各种源获取变换以不同方式变换网格实例.
...