可变存储与不可变存储

Mutable vs Immutable storage

本文关键字:存储 不可变      更新时间:2023-10-16

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

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

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

  3. 说到glBufferSubData,调用它和仅仅对映射指针进行memcpy真的有什么区别吗?我听说前者做超过1memcpy,是真的吗?
  4. 是否有
  5. 已知原因导致无法为不可变缓冲区指定使用提示?

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

即使用户只为缓冲区分配一次内存,使用可变缓冲区,如果需要,他总是能够再次分配内存。

这正是您不应该使用它们的原因。重新分配缓冲区对象的存储(在失效之外)不是一件有用的事情。司机必须做很多工作才能使其可行。

因此,拥有一个拿走你不应该使用的工具的 API 是一件好事。

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

您通常使用最适合情况的任何工具。拥有映射指针的目的是直接访问存储,因此将数据写入其他位置并手动复制它有点违背了该目的。

是否有

已知原因导致无法为不可变缓冲区指定使用提示?

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

相反,不可变缓冲区会让您声明打算如何使用缓冲区,然后让您使用它。如果您要求一个静态缓冲区,其内容永远不会修改,那么您不能修改它,句号。这与用法提示不同,在 API 级别可以防止这种情况,在用法提示中,您可以以任何特定方式使用任何缓冲区,而不管提示如何。

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