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

Updating uniform buffer objects costs performance?

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

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

因此,您应该根据此决定采用哪种策略。一些注意事项:

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