位標誌

位標誌是一組變數,通常是簡單的數值,可用於啟用或停用方法或其他程式碼結構的特定用途或功能。它們可以快速高效地完成此操作,因為它們在位級別進行操作。同一組中相關的標誌通常被賦予互補值,代表單個值(例如,十六進位制)中不同的位位置,因此多個標誌設定可以由單個值表示。

例如,在 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
}