本文將說明 WebGPU 在 Chrome 瀏覽器中可能無法運作或無法正常運作的原因,並提供解決問題的明確步驟 (如有可能)。
navigator.gpu 未定義
以下範例顯示 gpu
在 navigator
中無法使用時,可能會發生的 JavaScript 錯誤:
const adapter = await navigator.gpu.requestAdapter();
cancel Uncaught TypeError: Cannot read properties of undefined (reading 'requestAdapter')
原因可能是下列其中一個。請依照下列順序查看:
WebGPU 需要 ChromeOS、macOS 和 Windows 上的 Chrome 113 以上版本,以及 Android 上的 Chrome 121 以上版本。請在
chrome://version
中查看版本,並視需要更新。WebGPU 只能在安全的環境中使用。如果您透過不安全的通訊協定 (例如
http:
、file:
) 提供程式碼,請使用安全的https:
通訊協定,或是在開發網頁應用程式時,透過下列任一方式解決這個問題:使用
npx http-server
或python3 -m http.server
指令,在http://localhost
或http://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)
導致這種情況的原因如下:請依照下列順序查看:
如果使用者在
chrome://settings/system
中關閉「在可用時使用圖形加速功能」,WebGPU 就會停用。檢查這項設定是否已關閉,並重新開啟這個平台尚未支援 WebGPU。您可以啟用
chrome://flags/#enable-unsafe-webgpu
標記並重新啟動 Chrome。如要啟用 Linux 實驗功能,您也必須啟用chrome://flags/#enable-vulkan
標記。如需瞭解詳情,請參閱「無頭 Chrome 中的 WebGPU 支援」。已將 GPU 硬體加入封鎖清單。如果在
chrome://gpu
中看到「WebGPU 已透過封鎖清單或指令列停用」,您可以啟用chrome://flags/#enable-unsafe-webgpu
旗標並重新啟動 Chrome,藉此停用 WebGPU 轉接器封鎖清單。requestAdapter()
中傳遞的選項沒有相符的 GPU 轉接器。嘗試使用不同的選項呼叫requestAdapter()
。WebGPU 需要 GPU (硬體或軟體模擬)。如要檢查 Chrome 是否偵測到 GPU,請前往
chrome://gpu
。GPU 程序多次當機。你可以重新載入網頁或重新啟動 Chrome。詳情請參閱「WebGPU 裝置遺失最佳做法」。
WebGPU 速度比 WebGL 慢
開啟
chrome://gpu
,確認您可以讀取「WebGPU: Hardware accelerated」。如果您看到「WebGPU:僅限軟體,無法使用硬體加速」訊息,可能需要更新 GPU 驅動程式。直接將 WebGL 概念轉譯為 WebGPU 可能無法充分發揮 WebGPU 的獨特最佳化功能。請參閱「從 WebGL 到 WebGPU」,瞭解兩者的差異。
Windows 專屬限制
在 Windows 裝置上使用 WebGPU 時,請注意下列限制:
Chrome 不支援同時使用多個 GPU 轉接器。請參閱 issue chromium:329211593。
Chrome 一律會使用與其他 Chrome 工作負載相同的 GPU 轉接卡,在筆記型電腦上,這通常是內建顯示卡,因為這與電力使用量有關 (例如省電)。這表示在呼叫
requestAdapter()
時,powerPreference
選項不會有任何影響。