WebGPU: wskazówki i rozwiązania problemów

François Beaufort
François Beaufort

W tym dokumencie opisujemy, dlaczego WebGPU może nie działać lub nie działa w przeglądarce Chrome zgodnie z oczekiwaniami. Znajdziesz tu też jasne instrukcje, jak rozwiązać te problemy, gdy tylko jest to możliwe.

Ten przykład pokazuje błąd JavaScriptu, który może wystąpić, gdy gpu jest niedostępny w navigator:

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

Przyczyna może być następująca. Przejrzyj je w tej konkretnej kolejności:

  1. WebGPU wymaga przeglądarki Chrome 113 lub nowszej na urządzeniach z ChromeOS, macOS, Windows i Chrome w wersji 121 lub nowszej na urządzeniach z Androidem. Sprawdź wersję systemu na chrome://version i w razie potrzeby zaktualizuj ją.

  2. Interfejs WebGPU jest dostępny tylko w przypadku bezpiecznych kontekstów. Jeśli udostępniasz kod przy użyciu niezabezpieczonego protokołu (np. http:, file:), użyj bezpiecznego protokołu https: lub rozwiąż ten problem podczas tworzenia aplikacji internetowej w jeden z tych sposobów:

    • Udostępnij kod lokalnie w witrynie http://localhost lub http://127.0.0.1 za pomocą jednego z tych poleceń: npx http-server lub python3 -m http.server.

    • Dodaj źródło do pola „Niezabezpieczone źródła traktowane jako bezpieczne” chrome://flags/#unsafely-treat-insecure-origin-as-secure i ponownie uruchom Chrome.

    • Zainstaluj Node.js i uruchom npx servez --ssl, aby udostępniać folder przez https przy użyciu fałszywego certyfikatu. W Chrome nadal będzie pojawiać się ostrzeżenie, które możesz pominąć, klikając „Zaawansowane” a następnie „Przejdź do...”.

    • Udostępnij lokalny serwer WWW w internecie za pomocą programu ngrok.

Adapter GPU ma wartość null

Poniżej znajduje się przykład błędu JavaScriptu, który może wystąpić, gdy adapter uzyskany z wywołania requestAdapter() ma wartość null:

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

Oto możliwe przyczyny: Przejrzyj je w tej konkretnej kolejności:

  1. Procesor WebGPU jest wyłączony, gdy użytkownik wyłączył opcję „Użyj akceleracji grafiki, gdy jest dostępna” w usłudze chrome://settings/system. Sprawdź, czy to ustawienie jest wyłączone, i włącz je ponownie

  2. Ta platforma jeszcze nie obsługuje WebGPU. Możesz włączyć flagę chrome://flags/#enable-unsafe-webgpu i ponownie uruchomić Chrome. Aby korzystać z eksperymentów dotyczących Linuksa, musisz też włączyć flagę chrome://flags/#enable-vulkan. Więcej informacji znajdziesz w artykule na temat obsługi WebGPU w Chrome bez interfejsu graficznego.

  3. Sprzęt GPU został specjalnie zablokowany. Jeśli widzisz komunikat „WebGPU został wyłączony przez listę zablokowanych lub w wierszu poleceń” w chrome://gpu możesz wyłączyć listę zablokowanych adapterów WebGPU, włączając flagę chrome://flags/#enable-unsafe-webgpu i ponownie uruchom Chrome.

  4. Nie ma adaptera GPU pasującego do opcji przekazanych w polu requestAdapter(). Zadzwoń pod numer requestAdapter(), korzystając z innych opcji.

  5. WebGPU wymaga GPU (sprzętowego lub z emulacją programową). Aby sprawdzić, czy Chrome wykrywa GPU, wejdź na chrome://gpu.

WebGPU działa wolniej niż WebGL

  1. Otwórz chrome://gpu i upewnij się, że widzisz komunikat „WebGPU: Hardware accelerated” (Przyspieszenie sprzętowe przy użyciu interfejsu WebGPU). Jeśli widzisz komunikat „WebGPU: tylko oprogramowanie, akceleracja sprzętowa niedostępna”, może być konieczne zaktualizowanie sterowników GPU.

  2. Bezpośrednie tłumaczenie koncepcji WebGL na WebGPU może nie wykorzystywać w pełni możliwości, jakie oferuje jego wyjątkowe optymalizacje. Zapoznaj się z artykułem Od WebGL do WebGPU, aby poznać niektóre z tych różnic.

Ograniczenia związane z systemem Windows

Podczas korzystania z WebGPU na urządzeniach z systemem Windows pamiętaj o tych ograniczeniach:

  • Chrome nie pozwala na jednoczesne korzystanie z wielu kart GPU. Zobacz problem chromium:329211593.

  • Chrome zawsze używa tej samej karty GPU, która została przydzielona do innych zadań Chrome. Ze względu na zużycie energii (tj. oszczędzanie energii) w laptopach jest zwykle zintegrowana karta graficzna. Oznacza to, że opcja powerPreference nie ma wpływu na połączenie z numerem requestAdapter().