【发布时间】:2016-11-16 07:11:56
【问题描述】:
我对在 WebGL 中更新纹理或缓冲区的速度很感兴趣。 (我认为这种性能与 OpenGLES2 基本相同)
如果我需要每帧更新纹理或缓冲区一次,其中包含相同数量的字节大小的数据,这对性能有好处吗?
缓冲区使用量为 DRAW_DYNAMIC,这些缓冲区应由索引缓冲区绘制。
【问题讨论】:
标签: webgl opengl-es-2.0
我对在 WebGL 中更新纹理或缓冲区的速度很感兴趣。 (我认为这种性能与 OpenGLES2 基本相同)
如果我需要每帧更新纹理或缓冲区一次,其中包含相同数量的字节大小的数据,这对性能有好处吗?
缓冲区使用量为 DRAW_DYNAMIC,这些缓冲区应由索引缓冲区绘制。
【问题讨论】:
标签: webgl opengl-es-2.0
这实际上取决于设备/驱动程序/浏览器。没有一般的答案。一个设备或驱动程序对于缓冲区可能更快,另一个对于纹理可能更快。还有实际的访问权限。缓冲区没有随机访问,纹理有。如果您需要随机访问,您唯一的选择是纹理。
驱动程序优化的一个例子是,如果您替换整个缓冲区或纹理,驱动程序可以在内部创建一个新的缓冲区或纹理,然后在适当的时候开始使用它。如果它不这样做并且您更新当前正在使用的缓冲区或纹理,例如已经发出命令以使用缓冲区或纹理绘制某些东西但这些命令尚未执行,那么驱动程序将不得不停止你的程序,等待缓冲区或纹理被使用,然后它可以用新的内容替换它。这也表明gl.bufferData可以比gl.bufferSubData快,gl.texImage2D可以比gl.texSubImage2D快,但只有可以 >。同样,这取决于驱动程序它做什么,它可以和不能做什么优化,做什么和不做什么。
对于 WebGL 与 OpenGL ES 2,WebGL 更为严格。您提到了索引缓冲区。好吧,WebGL 必须验证索引缓冲区。绘制时,必须检查缓冲区中的所有索引是否在当前绑定和使用的属性缓冲区的范围内。 WebGL 实现会缓存此信息,因此他们不必再次执行此操作,但如果您更新索引缓冲区,该缓冲区的缓存将被清除,因此在这种情况下更新纹理可能比更新索引缓冲区更快。另一方面,它又回到了使用上。如果您将顶点位置放在纹理中并在纹理的顶点着色器中查找它们,而不是在缓冲区中使用它们,我在更新纹理时可能更快渲染顶点进行纹理查找可能会更慢.太慢又取决于您的应用和设备/驱动程序等...
【讨论】: