WebGPU: suggerimenti per la risoluzione dei problemi e correzioni

François Beaufort
François Beaufort

Questo documento spiega perché WebGPU potrebbe non essere utilizzabile o non funzionare come previsto nel browser Chrome, con passaggi chiari per risolvere i problemi, ove possibile.

L'esempio seguente mostra un errore JavaScript che potresti ricevere quando gpu non è disponibile in navigator:

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

Ciò potrebbe essere dovuto a uno dei seguenti motivi. Dai un'occhiata a questi contenuti in questo ordine specifico:

  1. WebGPU richiede Chrome 113 o versioni successive su ChromeOS, macOS, Windows e Chrome 121 o versioni successive su Android. Controlla la versione all'indirizzo chrome://version e, se necessario, aggiornala.

  2. Al momento non è possibile accedere a WebGPU da un service worker o da un worker condiviso. Se utilizzi un service worker o un worker condiviso, sposta il codice WebGPU in un worker dedicato o nel contesto della finestra globale.

  3. WebGPU è accessibile solo a contesti sicuri. Se pubblichi il codice tramite un protocollo non sicuro (ad esempio, http:, file:), utilizza il protocollo sicuro https: o risolvi il problema durante lo sviluppo dell'app web in uno dei seguenti modi:

    • Pubblica il tuo codice localmente su http://localhost o http://127.0.0.1 con uno di questi comandi: npx http-server o python3 -m http.server.

    • Aggiungi l'origine all'elenco "Origini non sicure trattate come sicure" di chrome://flags/#unsafely-treat-insecure-origin-as-secure e riavvia Chrome.

    • Installa Node.js ed esegui npx servez --ssl per gestire la cartella su https con un certificato falso. In Chrome riceverai ancora un avviso che puoi ignorare facendo clic su "Avanzate" e poi su "Procedi a...".

    • Esposizione del server web locale su internet con ngrok.

L'adattatore GPU è nullo

Di seguito è riportato un esempio di errore JavaScript che potresti ricevere quando l'adattatore generato dalla chiamata a requestAdapter() è nullo:

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

Ciò si verifica per uno dei seguenti motivi. Dai un'occhiata a questi contenuti in questo ordine specifico:

  1. La WebGPU è disattivata se l'utente ha disattivato l'opzione "Usa accelerazione grafica quando disponibile" in chrome://settings/system. Verifica se questa impostazione è disattivata e riattivala

  2. WebGPU non è ancora supportato su questa piattaforma. Puoi attivare il flag chrome://flags/#enable-unsafe-webgpu e riavviare Chrome. Per il supporto sperimentale in Linux, devi attivare anche il flag chrome://flags/#enable-vulkan. Per saperne di più, consulta Supporto WebGPU in Chrome headless.

  3. L'hardware GPU è stato specificamente inserito in una lista bloccata. Se in chrome://gpu viene visualizzato il messaggio "WebGPU è stato disattivato tramite la lista bloccata o la riga di comando", puoi disattivare la lista bloccata degli adattatori WebGPU attivando il flag chrome://flags/#enable-unsafe-webgpu e riavviando Chrome.

  4. Non esiste un adattatore GPU corrispondente per le opzioni trasmesse in requestAdapter(). Prova a chiamare il numero requestAdapter() con opzioni diverse.

  5. WebGPU richiede una GPU (emulata hardware o software). Puoi verificare se Chrome rileva una GPU visitando chrome://gpu.

La WebGPU è più lenta di WebGL

  1. Apri chrome://gpu e assicurati di poter leggere "WebGPU: accelerazione hardware". Se visualizzi il messaggio "WebGPU: solo software, accelerazione hardware non disponibile", potrebbe essere necessario aggiornare i driver GPU.

  2. La traduzione diretta dei concetti di WebGL in WebGPU potrebbe non sfruttare appieno le ottimizzazioni esclusive di WebGPU. Dai un'occhiata ad Da WebGL a WebGPU per conoscere alcune delle loro differenze.

Limitazioni specifiche di Windows

Tieni presente le seguenti limitazioni quando utilizzi WebGPU sui dispositivi Windows:

  • Chrome non supporta l'utilizzo di più adattatori GPU contemporaneamente. Vedi issue chromium:329211593.

  • Chrome utilizza sempre lo stesso adattatore GPU assegnato per altri carichi di lavoro di Chrome, che per i laptop è in genere la scheda grafica integrata, a causa dell'utilizzo della batteria (ad esempio, risparmio energetico). Significa che l'opzione powerPreference non ha alcun impatto sulla chiamata a requestAdapter().