Использование WebGL внутри Web Worker: возможно ли это?Как? - PullRequest
10 голосов
/ 21 октября 2011

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

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

Ответы [ 3 ]

25 голосов
/ 21 октября 2011

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

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

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

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

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

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

3 голосов
/ 23 июня 2016

Да, в Firefox!

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

Мы рады объявить о WebGL в Web Workers в Firefox 44+!С помощью нового API OffscreenCanvas вы можете создавать контекст WebGL вне основного потока.

3 голосов
/ 24 сентября 2015

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

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

...