Использование WebGL внутри Web Worker: возможно ли это? Как?

Я открыл эти тесты умножения матриц, и мой браузер (Firefox 7.0.1) завис до тесты закончились (я открывал страницу на стареньком Asus EeePC 1000H).

Я слышал, что веб-воркеры были изобретены, чтобы отделить обработку от отображения веб-страниц. Можно ли использовать API Web Workers, чтобы WebGL не останавливал весь веб-браузер?


person João Pinto Jerónimo    schedule 21.10.2011    source источник
comment
Из других новостей следует отметить, что эталонный тест устарел (использует старые версии различных матричных библиотек), неверен и недействителен (не удосужился проверить, действительно ли вызываемые функции вычисляют одно и то же). Вот тот, который не сломан stepheneb.github.com/webgl-matrix-benchmarks /   -  person gman    schedule 03.02.2012
comment
Еще нет. Но просто найдите WebGL в WebWorker, и вы увидите, что он находится в разработке.   -  person abergmeier    schedule 12.06.2013


Ответы (3)


Да, в Firefox!

https://hacks.mozilla.org/2016/01/webgl-off-the-main-thread/

Мы рады представить WebGL в Web Workers в Firefox 44+! Используя новый API OffscreenCanvas, теперь вы можете создавать контекст WebGL вне основного потока.

person DWoldrich    schedule 23.06.2016
comment
Это не совсем правильно. Это очень ограниченный API для рендеринга холста только с использованием transferControlToOffscreen API. - person loretoparisi; 26.07.2018

Для ясности: тест, на который вы ссылаетесь, вообще не использует WebGL. (Я должен знать, я написал это.) И в случае с этим конкретным тестом вы абсолютно точно можете запустить его в Web Worker сейчас, и это будет прекрасно.

(Забавный факт: Web Workers не поддерживали TypedArrays, когда тест был построен, и, поскольку большинство матричных библиотек полагаются на него, было непрактично запускать его в Worker в то время. С тех пор это было исправлено.)

В любом случае, чтобы ответить на ваш первоначальный вопрос: нет, WebGL не может работать в рабочей среде. Основным препятствием для этого является то, что для получения контекста WebGL вам нужно вызвать getContext для элемента холста. Веб-воркеры явно запрещают доступ к DOM (что хорошо, кстати!), и поэтому вы никогда не сможете получить доступ к WebGL из воркера.

Но это не так плохо, как вы думаете. Во-первых, учтите, что большая часть 3D-рендеринга в любом случае происходит в другом потоке. В частности, целая куча потоков, работающих на вашем GPU. Единственная часть, которую должен выполнить браузер, это сказать вашему графическому драйверу: «Эй! Начни рендерить несколько треугольников, используя эти данные!» а затем он движется дальше, не дожидаясь фактического рендеринга треугольников. Таким образом, хотя команды отрисовки должны выполняться из основного процесса, время, затрачиваемое на блокировку этого процесса, (обычно) очень мало.

Конечно, это не то, что отнимет у вас кучу времени, если вы программируете игру в реальном времени. У вас есть анимация, физика, ИИ, обнаружение столкновений, поиск пути... есть много неграфических задач, которые съедят ваш процессор заживо, если вы позволите им. В некоторых случаях (анимация) это обычно просто куски и куски матричной математики, как и тест, на который вы ссылаетесь! Однако, к счастью для нас, этот тип обработки МОЖЕТ быть выполнен в Worker, и все, что нам нужно для связи с основным потоком, — это данные, необходимые для рендеринга сцены.

Да, это создает некоторые проблемы с точки зрения синхронизации и передачи данных, но в целом это будет гораздо предпочтительнее, чем блокировать ваш браузер, пока мы пытаемся смоделировать столкновение этих 500 ящиков.

person Toji    schedule 21.10.2011
comment
О.. Поскольку эти скрипты называются glMatrix и CanvasMatrix, я предположил, что они использовали преимущества WebGL для умножения матриц... - person João Pinto Jerónimo; 21.10.2011

По умолчанию вы не можете использовать WebGL в Web Worker, как объяснил Тодзи.

Вы можете проверить WebGLWorker, который представляет собой библиотеку, которая позволяет вам делать вещи WebGL в Web Worker, прозрачное проксирование команд в основной поток. Вот хороший сообщение в блоге, в котором объясняется, как это работает.

person dcoz    schedule 24.09.2015