位标志

位标志是一组变量,通常是简单的数值,可用于启用或禁用方法或其他代码结构的特定用途或功能。它们可以快速高效地完成此操作,因为它们在位级别进行操作。同一组中相关的标志通常被赋予互补值,代表单个值(例如,十六进制)中不同的位位置,因此多个标志设置可以由单个值表示。

例如,在 WebGPU API 中,使用 GPUDevice.createBuffer() 方法创建 GPUBuffer 对象实例。调用此方法时,您在描述符中定义一个 usage 属性,其中包含一个或多个标志,这些标志启用该缓冲区的不同允许用途。

js
const descriptor = {
  usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE,
};

这些值在同一个命名空间中定义,每个都具有十六进制值

用途标志 十六进制表示 十进制等效值
GPUBufferUsage.MAP_READ 0x0001 1
GPUBufferUsage.MAP_WRITE 0x0002 2
GPUBufferUsage.COPY_SRC 0x0004 4
GPUBufferUsage.COPY_DST 0x0008 8
GPUBufferUsage.INDEX 0x0010 16
GPUBufferUsage.VERTEX 0x0020 32
GPUBufferUsage.UNIFORM 0x0040 64
GPUBufferUsage.STORAGE 0x0080 128
GPUBufferUsage.INDIRECT 0x0100 256
GPUBufferUsage.QUERY_RESOLVE 0x0200 512

当您查询 GPUBuffer.usage 属性时,会返回一个十进制数字,它是不同用途标志的不同十进制值的总和。回到上面的示例,查询使用前面指定的用途创建的 GPUBufferGPUBuffer.usage 将返回以下内容

  • GPUBufferUsage.COPY_SRC 的十进制等效值,4
  • 加上 GPUBufferUsage.MAP_WRITE 的十进制等效值,2
  • 等于 6。

由于为不同标志选择的值,每个值的组合都是唯一的,因此程序可以一目了然地从单个值中判断哪些标志已设置。此外,您可以使用位与运算符轻松测试组合值中设置了哪些标志

js
if (buffer.usage & GPUBufferUsage.MAP_WRITE) {
  // Buffer has MAP_WRITE usage
}