可变与不可变存储

时间:2019-07-23 12:10:10

标签: c++ opengl

关于OpenGL中的缓冲区对象的一些紧密相关的问题。

  1. 除了持久映射之外,还有其他原因分配不可变缓冲区吗?即使用户仅为该缓冲区分配一次内存,但对于可变缓冲区,他始终能够根据需要再次执行该操作。另外,使用可变缓冲区,您可以显式指定使用提示。

  2. 人们通常如何通过映射的指针更改数据?以我的看法,您可以更改单个元素或多个元素。对于单元素更改,我所能想到的就是映射指针上的operator[],就好像它是C样式的数组一样。对于多元素更改,我唯一想到的就是memcpy,但在那种情况下使用glBufferSubData会更好吗?

  3. 说到glBufferSubData,调用它和对映射指针执行memcpy确实有区别吗?我听说前者的功能不止1个memcpy,对吗?
  4. 您是否有不能为不可变缓冲区指定使用提示的已知原因?

我知道这些问题主要与性能有关,因此可以通过一个简单的“只需做一些剖析并看一下”就可以回答,但是在我发问这一点时,与设计无关,它与性能无关,即,我想知道在可变缓冲区与不可变缓冲区之间进行选择的良好做法,以及如何修改其内容。

1 个答案:

答案 0 :(得分:3)

  

即使用户只为该缓冲区分配一次内存,但对于可变缓冲区,他始终有能力在需要时再次执行该操作。

这就是为什么您使用它们的原因。重新分配缓冲区对象的存储(无效之外)不是有用的事情。驾驶员必须做很多工作才能使其变得可行。

因此,拥有可以删除不应使用的工具的API是一件好事。

  

人们通常如何通过映射的指针更改数据?

通常使用最适合这种情况的工具。拥有映射指针的目的是直接访问存储,因此将数据写入其他位置并手动复制是一种与之相反的工作。

  

您是否存在无法为不可变缓冲区指定使用提示的已知原因?

因为不可变缓冲区API是由不想拥有可怕,无用和毫无意义的参数的人编写的。可变实现缓冲区的用法提示被几种实现方式完全忽略,因为用户一直对这些提示的含义感到困惑,以至于人们在奇怪的场景中使用了它们。

不可变的缓冲区让您声明打算如何使用缓冲区,然后将其束缚住。如果您请求一个永远不会修改其内容的静态缓冲区,那么您不能对其进行修改。与使用提示不同,在API级别可以避免这种情况,在这种情况下,无论提示如何,您都可以以任何特定方式使用任何缓冲区。

提示是个坏主意,需要死掉。