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

Speed difference between updating texture or updating buffers

我对在 WebGL 中更新纹理或缓冲区的速度很感兴趣。 (我认为这个性能与 OpenGLES2 基本相同)

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

缓冲区使用量为 DRAW_DYNAMIC,这些缓冲区应由索引缓冲区绘制。

这真的取决于 device/driver/browser。没有通用的答案。一种设备或驱动程序对于缓冲区可能更快,而另一种对于纹理可能更快。还有实际的访问权限。缓冲区没有随机访问,纹理有。如果您需要随机访问,您唯一的选择就是纹理。

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

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