webgl中的drawElements vs drawArrays

时间:2015-01-21 19:55:45

标签: opengl-es webgl

如果我不打算共享任何顶点,使用drawElements而不是drawArrays是否有意义?

如果我理解正确的话,对于drawElements,如果索引数组超过~65k元素,我必须使用多个drawcalls,因为indexbuffer的uInt16限制(在webgl中)。

所以可以说是经验法则:

没有共享顶点,请使用drawArrays,因为它只有一个大的drawCall。

如果是共享顶点,请使用drawElements,因为可以保存GPU bandwith,如果需要多个drawcall,这也会比drawArrays产生更好的性能?

1 个答案:

答案 0 :(得分:13)

glDrawElements()的优势在理论上 简单:你使用更少的顶点,并且你可以使用后T& L缓存。惩罚是你必须使用索引数组,缓存局部性可能更糟。

由于后T& L缓存的大小会根据(例如)显卡的年龄而变化,因此比较变得复杂。较新的卡可能有较大的缓存,较旧的卡可能有较小的缓存。

但是,如果你没有在基元之间共享任何顶点,那么glDrawElements()对<{1}}有 no 优势,你应该使用{{1} }。

在更复杂的场景中,当您将额外绘制调用(使用glDrawArrays())的成本与额外顶点数据的成本和更多顶点着色器调用(使用glDrawElements())进行比较时,我希望简介。