WebGPU:疑難排解提示和修正

François Beaufort
François Beaufort

本文將說明 WebGPU 在 Chrome 瀏覽器中可能無法運作或無法正常運作的原因,並提供解決問題的明確步驟 (如有可能)。

以下範例顯示 gpunavigator 中無法使用時,可能會發生的 JavaScript 錯誤:

const adapter = await navigator.gpu.requestAdapter();
cancel Uncaught TypeError: Cannot read properties of undefined (reading 'requestAdapter')

原因可能是下列其中一個。請依照下列順序查看:

  1. WebGPU 需要 ChromeOS、macOS 和 Windows 上的 Chrome 113 以上版本,以及 Android 上的 Chrome 121 以上版本。請在 chrome://version 中查看版本,並視需要更新。

  2. WebGPU 只能在安全的環境中使用。如果您透過不安全的通訊協定 (例如 http:file:) 提供程式碼,請使用安全的 https: 通訊協定,或是在開發網頁應用程式時,透過下列任一方式解決這個問題:

    • 使用 npx http-serverpython3 -m http.server 指令,在 http://localhosthttp://127.0.0.1 上本機執行程式碼。

    • 將來源加入 chrome://flags/#unsafely-treat-insecure-origin-as-secure 的「視為安全的非安全來源」清單,然後重新啟動 Chrome。

    • 安裝 Node.js 並執行 npx servez --ssl,透過假憑證透過 https 服務資料夾。你仍會在 Chrome 中收到警告,你可以按一下「進階」,然後點選「繼續」來略過警告。

    • 使用 ngrok 將本機網路伺服器公開至網際網路。

GPU 轉接器為空值

以下是呼叫 requestAdapter() 後取得的轉換器為空值時,可能會發生的 JavaScript 錯誤範例:

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
cancel Uncaught TypeError: Cannot read properties of undefined (reading requestDevice)

導致這種情況的原因如下:請依照下列順序查看:

  1. 如果使用者在 chrome://settings/system 中關閉「在可用時使用圖形加速功能」,WebGPU 就會停用。檢查這項設定是否已關閉,並重新開啟

  2. 這個平台尚未支援 WebGPU。您可以啟用 chrome://flags/#enable-unsafe-webgpu 標記並重新啟動 Chrome。如要啟用 Linux 實驗功能,您也必須啟用 chrome://flags/#enable-vulkan 標記。如需瞭解詳情,請參閱「無頭 Chrome 中的 WebGPU 支援」。

  3. 已將 GPU 硬體加入封鎖清單。如果在 chrome://gpu 中看到「WebGPU 已透過封鎖清單或指令列停用」,您可以啟用 chrome://flags/#enable-unsafe-webgpu 旗標並重新啟動 Chrome,藉此停用 WebGPU 轉接器封鎖清單。

  4. requestAdapter() 中傳遞的選項沒有相符的 GPU 轉接器。嘗試使用不同的選項呼叫 requestAdapter()

  5. WebGPU 需要 GPU (硬體或軟體模擬)。如要檢查 Chrome 是否偵測到 GPU,請前往 chrome://gpu

  6. GPU 程序多次當機。你可以重新載入網頁或重新啟動 Chrome。詳情請參閱「WebGPU 裝置遺失最佳做法」。

WebGPU 速度比 WebGL 慢

  1. 開啟 chrome://gpu,確認您可以讀取「WebGPU: Hardware accelerated」。如果您看到「WebGPU:僅限軟體,無法使用硬體加速」訊息,可能需要更新 GPU 驅動程式。

  2. 直接將 WebGL 概念轉譯為 WebGPU 可能無法充分發揮 WebGPU 的獨特最佳化功能。請參閱「從 WebGL 到 WebGPU」,瞭解兩者的差異。

Windows 專屬限制

在 Windows 裝置上使用 WebGPU 時,請注意下列限制:

  • Chrome 不支援同時使用多個 GPU 轉接器。請參閱 issue chromium:329211593

  • Chrome 一律會使用與其他 Chrome 工作負載相同的 GPU 轉接卡,在筆記型電腦上,這通常是內建顯示卡,因為這與電力使用量有關 (例如省電)。這表示在呼叫 requestAdapter() 時,powerPreference 選項不會有任何影響。