更新统一缓冲区对象会降低性能

时间:2015-04-16 02:35:19

标签: opengl glsl

我用UBO替换了shader中的mvp矩阵等制服,以避免大量的glUniform ...()调用。但是为了在每个帧中更新UBO,我必须调用glBufferData(),这也会降低性能。现在我对是否回到使用制服或在着色器中使用统一块感到困惑。

1 个答案:

答案 0 :(得分:3)

指定一堆glUniform次调用通常比对glBufferData的单次调用要慢,除非您每帧只修改几个统一值。

因此,您应该基于此决定采用哪种策略。几个笔记:

  • 请记住,glBufferData可能不是更新缓冲区的最佳方法,因为它要求驱动程序在从调用返回之前从您提供的指针中复制数据。我会尝试使用glMapBufferRange并直接将更改写入其中。请记住,为了避免同步,您需要告诉驱动程序您不会从它给您的指针读取,并且您将使用标志GL_MAP_WRITE_BIT和{{来编写整个范围。 1}}
  • opengl调用的性能取决于实现:即使驱动程序被授权执行某些优化,例如分配新缓冲区而不是等待旧缓冲区可用,因为您没有请求能够使用在映射范围内的旧内容,它可能是同步的,所以唯一可靠的答案是在目标硬件上尝试并做基准测试。