我正在为 iOS 和 Android 制作游戏。 我在很多地方看到使用索引绘制比仅绘制三角形数组更有效。
问题是我使用的是有损压缩顶点(就像 md2 的文件格式),它比单独使用索引要少 - 数组:N * 3 (xyz) * 1 (uchar) + translate (12 bytes) + scale (12 bytes)。 元素:N * 3 (xyz) * 4 (uint) + 数组/~10
数组似乎比索引和压缩元素更好,尽管苹果的 OpenGL 分析器工具说我应该使用 glDrawElements..
OpenGL 实现是否更喜欢索引数组?还是因为索引数组包含的数据少于常规未压缩数组?
附注 我使用的是 OpenGL es 2.0,顶点着色器负责解压缩顶点。
最佳答案
您使用的是顶点数组还是顶点缓冲区对象?如果您正在使用顶点数组,那么您可能需要考虑查看 glDrawRangeElements
而不是 glDrawElements
。
除非你所有的多边形都有不同的顶点(不太可能),glDrawElements
将比 glDrawArray
更快,因为 glDrawElements
将利用事实上,重复的顶点将被加载到 gpu 缓存中,并且不必为该顶点所属的每个多边形加载多次。但是,对于 glDrawArray
,它将遍历数组并且无法关联相似的顶点,因此必须多次加载它们。
但是,这始终取决于您的具体情况。尝试使用分析器或使用这些方法中的每一种来获取帧率。在它们之间切换应该不会太难。如果一个明显更好,就使用那个。如果两者都不是特别好,那么它可能无关紧要。
请记住,过早的优化是万恶之源。祝你好运! :)
关于iphone - glDrawElements vs glDrawArray 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6682771/