【问题标题】:glDrawElements vs glDrawArray efficiencyglDrawElements vs glDrawArray 效率
【发布时间】:2011-07-13 17:07:15
【问题描述】:

我正在为 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,而顶点着色器是解压缩顶点的那个。

【问题讨论】:

    标签: iphone android opengl-es


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      但是,使用 glDrawArrays(),您唯一的选择是按顺序遍历列表。

      必须进行实验。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-22
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多