glDrawElements vs glDrawArray效率

时间:2011-07-13 17:07:15

标签: iphone android opengl-es

我正在制作适用于iOS和Android的游戏。 我已经在很多地方看到使用索引绘制比仅绘制三角形数组更有效。

问题是我正在使用有损压缩顶点(比如md2的文件格式),它只需要少于索引 - 数组:N * 3(xyz)* 1(uchar)+转换(12字节)+比例(12字节)。 元素:N * 3(xyz)* 4(uint)+数组/ ~10

似乎数组甚至比索引和压缩元素更好的选择,尽管苹果的OpenGL分析器工具说我应该使用glDrawElements ..

OpenGL实现是否更喜欢索引数组?或者是因为索引数组包含的数据少于常规的未压缩数组?

P.S。 我正在使用OpenGL es 2.0,而顶点着色器是解压缩顶点的人。

2 个答案:

答案 0 :(得分:3)

您使用的是顶点阵列还是顶点缓冲区对象?如果您使用的是顶点阵列,那么您可能需要考虑查看glDrawRangeElements而不是glDrawElements

除非你的所有多边形都有不同的顶点(非常不可能),glDrawElements将比glDrawArray快,因为glDrawElements将利用重复顶点将被加载到gpu缓存,并且不必为该顶点所属的每个poly加载多次。但是,对于glDrawArray,它将遍历数组并且无法关联相似的顶点,因此必须多次加载它们。

但是,它总是取决于您的具体情况。尝试使用分析器或使用这些方法获取帧速率。在它们之间切换应该不会太难。如果一个明显更好,请使用那个。如果两者都不是更好,那么它可能并不重要。

请记住,过早优化是万恶之源。祝好运! :)

答案 1 :(得分:1)

使用glDrawElements()将节省大量内存,您可以按任意顺序指定数组元素。

然而,使用glDrawArrays(),您唯一的选择是按顺序迭代列表。

必须进行实验。