如果我不打算共享任何顶点,使用drawElements而不是drawArrays是否有意义?
如果我理解正确的话,对于drawElements,如果索引数组超过~65k元素,我必须使用多个drawcalls,因为indexbuffer的uInt16限制(在webgl中)。
所以可以说是经验法则:
没有共享顶点,请使用drawArrays,因为它只有一个大的drawCall。
如果是共享顶点,请使用drawElements,因为可以保存GPU bandwith,如果需要多个drawcall,这也会比drawArrays产生更好的性能?
答案 0 :(得分:13)
glDrawElements()
的优势在理论上 简单:你使用更少的顶点,并且你可以使用后T& L缓存。惩罚是你必须使用索引数组,缓存局部性可能更糟。
由于后T& L缓存的大小会根据(例如)显卡的年龄而变化,因此比较变得复杂。较新的卡可能有较大的缓存,较旧的卡可能有较小的缓存。
但是,如果你没有在基元之间共享任何顶点,那么glDrawElements()
对<{1}}有 no 优势,你应该使用{{1} }。
在更复杂的场景中,当您将额外绘制调用(使用glDrawArrays()
)的成本与额外顶点数据的成本和更多顶点着色器调用(使用glDrawElements()
)进行比较时,我希望简介。