可变存储与不可变存储
Mutable vs Immutable storage
关于OpenGL中缓冲区对象的几个密切相关的问题。
-
除了持久映射之外,还有其他原因需要分配不可变缓冲区吗?即使用户只为缓冲区分配一次内存,使用可变缓冲区,如果需要,他总是能够再次分配内存。此外,使用可变缓冲区,您可以显式指定使用提示。
-
人们通常如何通过映射的指针更改数据?在我看来,您可以对单个元素或多个元素进行更改。对于单元素更改,我所能想到的只是映射指针上的
operator[]
,就好像它是一个 C 样式数组一样。对于多元素更改,我唯一能想到的就是memcpy
,但在这种情况下,使用glBufferSubData
不是更好吗? - 说到
glBufferSubData
,调用它和仅仅对映射指针进行memcpy
真的有什么区别吗?我听说前者做超过1memcpy
,是真的吗?
是否有 - 已知原因导致无法为不可变缓冲区指定使用提示?
我知道这些问题主要是关于性能的,因此可以用一个简单的"只是做一些分析然后看看"来回答,但在我问这个问题的时候,与其说是关于性能,不如说是关于设计 - 即,我想知道在可变缓冲区与不可变缓冲区之间进行选择的良好实践, 以及我应该如何修改它们的内容。
即使用户只为缓冲区分配一次内存,使用可变缓冲区,如果需要,他总是能够再次分配内存。
这正是您不应该使用它们的原因。重新分配缓冲区对象的存储(在失效之外)不是一件有用的事情。司机必须做很多工作才能使其可行。
因此,拥有一个拿走你不应该使用的工具的 API 是一件好事。
人们通常如何通过映射的指针更改数据?
您通常使用最适合情况的任何工具。拥有映射指针的目的是直接访问存储,因此将数据写入其他位置并手动复制它有点违背了该目的。
是否有已知原因导致无法为不可变缓冲区指定使用提示?
因为不可变的缓冲区 API 是由那些不想拥有糟糕、无用和毫无意义的参数的人编写的。可变缓冲区上的使用提示被一些实现完全忽略,因为用户一直对这些提示的含义感到困惑,以至于人们在奇怪的场景中使用它们。
相反,不可变缓冲区会让您声明打算如何使用缓冲区,然后让您使用它。如果您要求一个静态缓冲区,其内容永远不会修改,那么您不能修改它,句号。这与用法提示不同,在 API 级别可以防止这种情况,在用法提示中,您可以以任何特定方式使用任何缓冲区,而不管提示如何。
提示是个坏主意,需要死。
- 正在寻找C++不可变的hashset/hashmap
- C++存储带有可变参数的回调
- 具有常量属性的不可变类
- 为什么将函数传递给内核会导致数据变得不可变?
- 现代c++编译器会优化不可变的临时变量吗
- 为什么重复的空基存储不与 vtable 指针重叠?
- C++中的不可变列表
- 如何将地图作为不可变地图传递?
- 不可变的全局对象应该声明为"const my_result_t BLAH"还是"extern const my_result_t BLAH;"?
- 向不可变纹理存储提供数据
- 在C++中创建不可变且高效的类的惯用方法
- std::shared_ptr<std::string const> 可以作为引用计数的不可变字符串的有效实现吗?
- 编写接受可变跨度作为不可变跨度的模板函数
- 可变存储与不可变存储
- 不可变数据模型的内存管理
- 在C++中创建不可变对象的更好方法
- 矢量存储不一致的数据
- 如何使用分支逻辑构造不可变数据类型的实例
- 不可变的 lambda 函数:复制捕获的变量是否允许是 const
- C++ 不可变的自定义类按引用或值传递