5

首先,OpenGL 中有 8 种类型的缓冲区对象:

  • GL_ARRAY_BUFFER​</li>
  • GL_ELEMENT_ARRAY_BUFFER​</li>
  • GL_COPY_READ_BUFFER
  • ...

它们是枚举,或者更具体地说是 GLenum 的。其中 GLenum 是一个无符号的 32 位整数,可以说它的值高达 ~ 4,743,222,432。

缓冲区对象的大多数用途涉及将它们绑定到某个目标,如下所示:例如

glBindBuffer (GL_ARRAY_BUFFER, 缓冲区 [大小]);

[void glBindBuffer(GLenum 目标,GLuint 缓冲区)] 文档

我的问题是 - 如果它是一个枚举,它的唯一值必须分别是 0,1,2,3,4..7 那么如果它只有高达 7 的值,为什么要一直让它成为一个 32 位整数呢?请原谅我对 CS 和 OpenGL 的了解,这似乎是不道德的。

4

2 回答 2

6

枚举不仅仅用于缓冲区 - 但在任何地方都需要一个符号常量。目前,分配了数千个枚举值(查看您的 GL.h 和最新的glext.h。请注意,供应商被分配了他们的官方枚举范围,因此他们可以在不干扰其他人的情况下实现特定于供应商的扩展 - 所以 32Bit 枚举空间是不错的主意 此外,在现代 CPU 架构上,使用小于 32 位的效率不会更高,因此这在性能方面不是问题。

更新: 正如 Andon M. Coleman 指出的那样,目前只分配了 16 位枚举范围。链接OpenGL Enumant Allocation Policies可能很有用,它也有以下注释:

从历史上看,一些单一供应商扩展的枚举值以 1000 个块为单位分配,从块 [102000,102999] 开始并逐渐向上。此范围内的值不能表示为 16 位无符号整数。这对某些实现造成了重大且不必要的性能损失。已经分配给供应商的这些块将保持分配状态,除非供应商自愿释放整个块,但不会再分配此范围内的块。

其中大部分似乎已被删除以支持 16 位值,但 32 位值已被使用。在当前的 glext.h 中,仍然可以找到一些高于 0xffff 的(过时的)枚举数,例如

#ifndef GL_PGI_misc_hints
#define GL_PGI_misc_hints 1
#define GL_PREFER_DOUBLEBUFFER_HINT_PGI   0x1A1F8
#define GL_CONSERVE_MEMORY_HINT_PGI       0x1A1FD
#define GL_RECLAIM_MEMORY_HINT_PGI        0x1A1FE
...
于 2013-12-29T20:18:29.693 回答
0

你为什么要使用short呢?你会在什么情况下通过使用 short 或 uint8_t 而不是 GLuint 来进行枚举和 const 声明,甚至可以节省超过 8k ram(如果近一千个 GLenums 的报告是正确的)?考虑到潜在的硬件不兼容和潜在的跨平台错误带来的麻烦,即使在原始 2mb Voodoo3d 图形硬件的上下文中尝试保存类似 8k ram 的东西有点奇怪,更不用说 SGL 超级计算机农场 OpenGL 了为。

此外,现代 x86 和 GPU 硬件一次对齐 32 位或 64 位,您实际上会停止 CPU/GPU 的操作,因为必须将寄存器的 24 位或 56 位清零然后读取/写入,而一旦它被复制进去,它就可以在标准 int 上运行。从 OpenGL 开始,计算资源往往比内存更有价值,而在程序的生命周期中您可能会进行数十亿次状态更改,您将节省大约 10kb (如果您将每个 32 位 GLuint 枚举替换为 uint8_t 枚举,则内存最大值 (千字节)。我现在很努力不要变得愤世嫉俗,呵呵。

例如,像 uint18_t 之类的东西的一个有效原因是数据适合该位深度的大型数据缓冲区/算法。堆栈上的 1024 个整数与 1024 个 uint8_t 变量为 8k,我们是否要将头发分割超过 8k?现在考虑一个 4000*2500*32 位的 4k 原始位图图像,我们说的是几百兆,如果我们使用 64 位 RGBA 缓冲区代替标准 8 位 RGBA8 缓冲区,它的大小将是 8 倍,或者四倍如果我们使用 32 位 RGBA 编码,则在大小上。将其乘以打开的纹理数量或保存的图片数量,并为所有额外的内存交换一些 cpu 操作是有意义的,尤其是在这种类型的工作环境中。

That is where using a non standard integer type makes sense. Unless you're on a 64k machine or something (like an old-school beeper, good luck running OpenGL on that) system if you're trying to save a few bits of memory on something like a const declaration or reference counter you're just wasting everyone's time.

于 2015-06-16T04:03:51.477 回答