glDrawElements和glDrawArray的效率比较

6
我正在为iOS和Android制作游戏。 我在很多地方看到,使用索引进行绘图比仅使用三角形数组更高效。
问题是我正在使用有损压缩的顶点(例如md2文件格式),它比仅使用索引单独占用更少的空间 - 数组:N * 3(xyz)* 1(uchar)+ translate(12字节)+ scale(12字节)。 元素:N * 3(xyz)* 4(uint)+ Array / ~10
似乎数组甚至比索引和压缩元素更好的选择,虽然苹果的OpenGL分析工具建议我使用glDrawElements。。
OpenGL实现是否更喜欢索引数组?还是因为索引数组包含的数据量比常规未压缩数组少?
注: 我正在使用OpenGL ES 2.0,并且顶点着色器是解压缩顶点的。
2个回答

3
您是否正在使用顶点数组或顶点缓冲对象?如果您正在使用顶点数组,则可以考虑使用 glDrawRangeElements 而不是 glDrawElements
除非所有的多边形都有独立的顶点(这很不可能),glDrawElementsglDrawArray 更快,因为 glDrawElements 利用了重复顶点将被加载到 gpu 缓存中的事实,并且不必为每个包含该顶点的多边形再次加载它。然而,对于 glDrawArray,它会遍历数组并无法关联相似的顶点,因此它必须多次加载它们。
然而,这始终取决于您的特定情况。尝试使用分析器或每种方法获取帧速率。在它们之间切换应该不太难。如果一个明显更好,请使用那个。如果没有一个明显更好,那么可能就不太重要了。
记住,过早优化是万恶之源。祝您好运! :)

1

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

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

您必须进行实验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接