c++ - 可变存储与不可变存储

标签 c++ opengl

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

  1. 除了持久映射之外,还有其他原因来分配不可变缓冲区吗?即使用户只为缓冲区分配内存一次,但使用可变缓冲区,如果需要,他始终可以再次分配内存。另外,使用可变缓冲区,您可以显式指定使用提示。

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

    <
  3. 说到 glBufferSubData,调用它和仅在映射指针上执行 memcpy 之间真的有什么区别吗?我听说前者执行了超过 1 个 memcpy,是真的吗?
  4. 是否存在无法为不可变缓冲区指定使用提示的已知原因?

我知道这些问题主要与性能有关,因此可以用简单的“只需进行一些分析并查看”来回答,但在我问这个问题时,与其说是关于性能,不如说是关于设计 - 即,我想知道在可变缓冲区与不可变缓冲区之间进行选择的良好做法,以及我应该如何修改它们的内容。

最佳答案

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/

相关文章:

c++ - 使用带有多重继承的enable_shared_from_this

c++ - 四叉树只绘制在窗口的右上角

c++ - OpenGL/C++ 将所有纹理 Assets 作为静态成员存储在单独的类中

c++ - dwFileOffsetHigh 和 dwFileOffsetLow 解释

c++ - "VC++"和 "C++"有什么区别?

c++ - 标准 C++ 中是否有固定宽度的 bool 类型?

c++ - 跟进: Asynchronous off-screen query performance

java - 如何实现 FPS 相机?

java - OpenGL 旋转相机

c++ - boost 函数绑定(bind)编译时出现转换错误