更新纹理或更新缓冲区之间的速度差异

时间:2016-11-16 07:11:57

标签: webgl opengl-es-2.0

我对WebGL中更新纹理或缓冲区的速度感兴趣。 (我认为这种性能与OpenGLES2大致相同)

如果我需要每帧更新纹理或缓冲区一次,其中包含相同数量的字节大小的数据,这对性能有好处吗?

缓冲区使用将是DRAW_DYNAMIC,这些缓冲区应该由索引缓冲区绘制。

1 个答案:

答案 0 :(得分:2)

这将取决于设备/驱动程序/浏览器。没有一般的答案。一个设备或驱动程序对缓冲区可能更快,另一个对纹理可能更快还有实际的访问权限。缓冲区没有随机访问,纹理可以。如果你需要随机访问,你唯一的选择是纹理。

驱动程序优化的一个示例是,如果替换整个缓冲区或纹理,驱动程序可以在内部创建新缓冲区或纹理,然后在适当时开始使用它。如果它没有这样做并且您更新当前正在使用的缓冲区或纹理,就像已经发出命令使用缓冲区或纹理绘制某些东西但这些命令尚未执行,则驱动程序将必须停止你的程序,等待使用缓冲区或纹理,然后它可以用新内容替换它。这也表明gl.bufferData 可以gl.bufferSubData更快,而gl.texImage2D 可以gl.texSubImage2D更快,但它&# 39;只有可以。同样,它取决于驱动程序的功能,它可以做什么,可以做什么,不做什么,不做什么。

对于WebGL与OpenGL ES 2,WebGL更严格。你提到了索引缓冲区。好吧,WebGL必须验证索引缓冲区。绘制时,必须检查缓冲区中的所有索引是否在当前绑定和使用的属性缓冲区的范围内。 WebGL实现缓存此信息,因此他们不必再次执行此操作,但如果更新索引缓冲区,则清除该缓冲区的缓存,因此在这种情况下更新纹理可能比更新索引缓冲区更快。另一方面,它又回到了使用状态。如果你在纹理中放置顶点位置并在纹理的顶点着色器中查找它们而在缓冲区中使用它们我更新纹理可能更快渲染顶点做纹理查找是可能更慢。太慢了你的应用程序和设备/驱动程序等......