关于 OpenGL 中缓冲区对象的一些密切相关的问题。
除了持久映射之外,还有其他原因来分配不可变缓冲区吗?即使用户只为缓冲区分配内存一次,但使用可变缓冲区,如果需要,他始终可以再次分配内存。另外,使用可变缓冲区,您可以显式指定使用提示。
人们通常如何通过映射指针更改数据?在我看来,您可以对单个元素或多个元素进行更改。对于单元素更改,我能想到的只是映射指针上的
<operator[]
,就好像它是 C 样式数组一样。对于多元素更改,我唯一能想到的就是memcpy
,但在这种情况下,使用glBufferSubData
不是更好吗?- 说到
glBufferSubData
,调用它和仅在映射指针上执行memcpy
之间真的有什么区别吗?我听说前者执行了超过 1 个memcpy
,是真的吗? - 是否存在无法为不可变缓冲区指定使用提示的已知原因?
我知道这些问题主要与性能有关,因此可以用简单的“只需进行一些分析并查看”来回答,但在我问这个问题时,与其说是关于性能,不如说是关于设计 - 即,我想知道在可变缓冲区与不可变缓冲区之间进行选择的良好做法,以及我应该如何修改它们的内容。
最佳答案
Even if the user allocates memory for the buffer only once, with mutable buffers he always has the ability to do it again if he needs to.
这正是您不应该使用它们的原因。重新分配缓冲区对象的存储(在失效之外)并不是一件有用的事情。司机必须做很多工作才能使其可行。
因此,拥有一个 API 来去掉您不应该使用的工具是一件好事。
How do people usually change data through a mapped pointer?
您通常会使用最适合具体情况的工具。拥有映射指针的目的是直接访问存储,因此将数据写入其他地方并手动复制它有点违背了这一目的。
Is there a known reason why you can't specify a usage hint for an immutable buffer?
因为不可变缓冲区 API 是由那些不想拥有可怕的、无用的和毫无意义的参数的人编写的。多个实现完全忽略了可变缓冲区的使用提示,因为用户一直对这些提示的含义感到困惑,以至于人们在奇怪的场景中使用它们。
不可变缓冲区会让您说明打算如何使用缓冲区,然后让您坚持下去。如果您要求一个静态缓冲区,其内容您永远不会修改,那么您不能修改它,就这样。这在 API 级别被阻止,与使用提示不同,在使用提示中,无论提示如何,您都可以以任何特定方式使用任何缓冲区。
提示是个坏主意,需要取消。
关于c++ - 可变存储与不可变存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163926/