按位标志
**位标志**是一组变量,通常是简单的数值,可用于启用或禁用方法或其他代码结构的特定用法或功能。它们可以快速有效地做到这一点,因为它们在位级别进行操作。同一组中的相关标志通常被赋予互补的值,表示单个值(例如十六进制)中的不同位位置,以便可以使用单个值表示多个标志设置。
例如,在WebGPU API中,使用GPUDevice.createBuffer()
方法创建GPUBuffer
对象实例。调用此方法时,您在描述符中定义一个usage
属性,其中包含一个或多个标志,以启用该缓冲区的不同允许用法。
js
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
属性时,您将获得一个返回的十进制数字,它是不同使用标志的不同十进制值的总和。回到上面的示例,查询前面指定的用法创建的GPUBuffer
的GPUBuffer.usage
将返回以下内容:
GPUBufferUsage.COPY_SRC
的十进制等价物,4- 加上
GPUBufferUsage.MAP_WRITE
的十进制等价物,2 - 等于 6。
由于为不同的标志选择了值,因此每种值的组合都是唯一的,因此程序可以一目了然地从单个值中分辨出哪些标志已设置。此外,您可以使用按位与运算符轻松测试组合值中设置了哪些标志。
js
if (buffer.usage & GPUBufferUsage.MAP_WRITE) {
// Buffer has MAP_WRITE usage
}