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

François Beaufort
François Beaufort

W tym dokumencie wyjaśniamy, dlaczego interfejs WebGPU może nie działać w przeglądarce Chrome zgodnie z oczekiwaniami. Znajdziesz w nim też jasne instrukcje umożliwiające rozwiązanie problemów, gdy tylko jest to możliwe.

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

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

Oto możliwa przyczyna: Przejrzyj je w tej kolejności:

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

  2. WebGPU nie jest obecnie dostępny z poziomu skryptu service worker ani ze współdzielonej instancji roboczej. Jeśli używasz skryptu service worker lub współdzielonej instancji roboczej, przenieś kod WebGPU do dedykowanej instancji roboczej lub do globalnego kontekstu okna.

  3. Interfejs WebGPU jest dostępny tylko w bezpiecznych kontekstach. Jeśli udostępniasz kod za pomocą niezabezpieczonego protokołu (np. http:, file:), użyj bezpiecznego protokołu https: lub rozwiąż ten problem podczas tworzenia aplikacji internetowej, korzystając z jednego z tych sposobów:

    • Udostępniaj kod lokalnie w http://localhost lub http://127.0.0.1, korzystając z jednego z tych poleceń: npx http-server lub python3 -m http.server.

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

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

    • Udostępnij lokalny serwer WWW, używając narzędzia ngrok.

Adapter GPU ma wartość null

Poniżej znajduje się przykład błędu JavaScriptu, który może się pojawić, gdy adapter uzyskiwany 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)

Przyczyny mogą być następujące. Przejrzyj je w tej kolejności:

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

  2. Interfejs WebGPU nie jest jeszcze obsługiwany na tej platformie. Możesz włączyć flagę chrome://flags/#enable-unsafe-webgpu i ponownie uruchomić Chrome. Aby uzyskać pomoc eksperymentalną dla systemu Linux, musisz też włączyć flagę chrome://flags/#enable-vulkan. Więcej informacji znajdziesz w artykule o obsłudze technologii WebGPU w Chrome bez interfejsu graficznego.

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

  4. Nie ma adaptera GPU pasującego do opcji przekazanych w requestAdapter(). Spróbuj zadzwonić pod numer requestAdapter(), korzystając z innych opcji.

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

WebGPU jest wolniejszy niż WebGL

  1. Otwórz chrome://gpu i sprawdź, czy widzisz komunikat „WebGPU: sprzętowa akceleracja sprzętowa”. 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 platformie WebGPU może nie w pełni wykorzystać możliwości zapewnianych przez WebGPU unikalnej optymalizacji. Informacje o różnicach między tymi rozwiązaniami znajdziesz w artykule Od WebGL do WebGPU.

Ograniczenia specyficzne dla systemu Windows

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

  • Chrome nie pozwala na jednoczesne korzystanie z wielu kart graficznych. Zobacz issue chromium:329211593.

  • Chrome zawsze używa tej samej karty GPU, która została przypisana do innych zadań w Chrome. W przypadku laptopów jest zwykle zintegrowana karta graficzna ze względu na aspekt zużycia energii (np. oszczędzanie energii). Oznacza to, że opcja powerPreference nie ma żadnego wpływu na wywołanie requestAdapter().