`
v5qqcom
  • 浏览: 1297700 次
文章分类
社区版块
存档分类
最新评论

OpenGL ES draw call优化

 
阅读更多

1)glDrawArrays vs glDrawElements
glDrawArrays只能用在顶点有序,无共享顶点的情况。否则会导致顶点数很多,效率很低。一般情况都使用glDrawElements

另一个角度说,使用glDrawArrays一般是三角带,但往往一个模型要用多个三角带才能表达,这样就需要多次draw call,所以不如使用索引,一个draw call搞定。

2) batch的一些问题
最基本的,mesh全部使用GL_TRIANGLES,动态合并draw call (根据材质是否一致等条件)

比较材质可使用hash值比较,但材质可能是动态的(如顶点色动画,uv动画之类),要考虑到

draw call可以分为是否使用depth buffer,如果不使用depth buffer,即前后关系和绘制顺序有关,则遇到这种draw call就必须flush之前的batch buffer。如果使用depth buffer,则可以保留之前的batch buffer。

实际上,渲染前应该对所有的 use depth buffer draw call按照材质进行排序。

mesh如果使用GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN,则需要使用退化的三角形batch

batch本身需要进行copy顶点数据的操作,如果draw call本身已经比较大,可以不batch,所以需要一个阀值判断某个draw call是否要batch。如果不batch,则可能会打断batch(即要flush当前batch buffer),但向上面所说的,如果当前的batch buffer是使用depth buffer的,而这个draw call也是使用depth buffer的,则可以不打断。

多pass材质不能被batch

除了使用材质排序优化batch,也可以使用draw call按材质分组的方法,其实这是用空间换时间。省下了排序的时间,消耗一些内存保存这些组。

3)使用混合数组优化,即arrays of structs

4) 混合数组的struct中,顶点属性的顺序按照目标设备进行优化,例如:pos,normal,color,uv。。。之类

5) 使用VBO


6) 顶点buffer中的顶点按照三角带的方式排列优化,有利于顶点缓存命中。

TBC

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics