WebGPU: советы и исправления по устранению неполадок

Франсуа Бофор
François Beaufort

В этом документе объясняется, почему WebGPU может быть неработоспособен или не работает должным образом в браузере Chrome, а также приведены четкие инструкции по устранению проблем, где это возможно.

В следующем примере показана ошибка JavaScript, которая может возникнуть, если gpu недоступен в navigator :

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

Это может быть вызвано одной из следующих причин. Посмотрите их в этом конкретном порядке:

  1. Для WebGPU требуется Chrome 113 или более поздней версии на ChromeOS, macOS, Windows и Chrome 121 или более поздней версии на Android. Проверьте свою версию на chrome://version и при необходимости обновите ее.

  2. WebGPU доступен только для защищенных контекстов. Если вы передаете свой код по небезопасному протоколу (например, http: , file: ), либо используйте безопасный протокол https: либо устраните эту проблему во время разработки веб-приложения одним из следующих способов:

    • Размещайте свой код локально на http://localhost или http://127.0.0.1 с помощью любой из этих команд: npx http-server или python3 -m http.server .

    • Добавьте источник в список «Небезопасные источники, рассматриваемые как безопасные» в chrome://flags/#unsafely-treat-insecure-origin-as-secure и перезапустите Chrome.

    • Установите Node.js и запустите npx servez --ssl чтобы передать вашу папку через https с поддельным сертификатом. Вы по-прежнему получите предупреждение в Chrome, которое можно обойти, нажав «Дополнительно», а затем «Перейти к...».

    • Откройте свой локальный веб-сервер в Интернете с помощью ngrok .

Адаптер графического процессора имеет значение null

Ниже приведен пример ошибки JavaScript, которая может возникнуть, если адаптер, полученный при вызове requestAdapter() имеет значение null:

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

Это происходит по одной из следующих причин. Посмотрите их в этом конкретном порядке:

  1. WebGPU отключается, когда пользователь отключил параметр «Использовать графическое ускорение, если оно доступно» в chrome://settings/system . Проверьте, отключен ли этот параметр, и включите его снова.

  2. WebGPU пока не поддерживается на этой платформе. Вы можете включить флаг chrome://flags/#enable-unsafe-webgpu и перезапустить Chrome. Для экспериментальной поддержки Linux вам также необходимо включить флаг chrome://flags/#enable-vulkan . Чтобы узнать больше, ознакомьтесь с поддержкой WebGPU в Headless Chrome .

  3. Аппаратное обеспечение графического процессора было специально занесено в черный список. Если вы видите сообщение «WebGPU отключен через черный список или командную строку» в chrome://gpu , вы можете отключить черный список адаптеров WebGPU, включив флаг chrome://flags/#enable-unsafe-webgpu и перезапустив Chrome.

  4. Для параметров, переданных в requestAdapter() , не существует соответствующего адаптера графического процессора. Попробуйте вызвать requestAdapter() с разными параметрами .

  5. Для WebGPU требуется графический процессор (аппаратный или программно-эмулируемый). Вы можете проверить, обнаруживает ли Chrome графический процессор, посетив chrome://gpu .

WebGPU медленнее, чем WebGL

  1. Откройте chrome://gpu и убедитесь, что вы можете прочитать «WebGPU: аппаратное ускорение». Если вы прочитали «WebGPU: только программное обеспечение, аппаратное ускорение недоступно», возможно, вам необходимо обновить драйверы графического процессора.

  2. Непосредственный перевод концепций WebGL в WebGPU может не полностью использовать преимущества уникальных оптимизаций WebGPU. Ознакомьтесь с разделом «От WebGL к WebGPU» , чтобы узнать о некоторых их различиях.

Ограничения, специфичные для Windows

Помните о следующих ограничениях при использовании WebGPU на устройствах Windows:

  • Chrome не поддерживает одновременное использование нескольких адаптеров графического процессора. См. выпуск chromium:329211593 .

  • Chrome всегда использует тот же адаптер графического процессора, который был выделен для других рабочих нагрузок Chrome, которым для ноутбуков обычно является встроенная видеокарта из-за аспекта энергопотребления (т. е. энергосбережения). Это означает, что опция powerPreference не оказывает никакого влияния при вызове requestAdapter() .