Может ли веб-работник отображать на WebGL-Canvas? - PullRequest
2 голосов
/ 02 февраля 2012

Я не понимаю, как работают веб-работники ... Являются ли веб-работники параллельными или просто вытесненными?

Безопасно ли для веб-работников отображать в контексте webgl?

Если у меня есть только рендеринг веб-работника в контекст webgl, и мой основной «поток» также не вызывает работника, безопасно ли для веб-работника рендеринг в контекст webgl?

Ответы [ 2 ]

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

Когда Web Worker создается, вы присваиваете ему URI, указывающий на файл JavaScript.Он загружает этот файл JavaScript в новый поток уровня ОС.Вы не можете контролировать сходство с конкретными ядрами или приоритетами потоков (на момент написания статьи), но созданный базовый поток является реальным и беспрепятственным.По умолчанию JavaScript, работающий в потоке веб-работника, НЕТ доступа к DOM: вам не предоставлен доступ ни к объекту окна, ни к каким-либо классам, связанным с DOM.

Семантика потока веб-рабочего делает его почти полностьюне пришвартованный из потока DOM по умолчанию.Первое, что интересно, это то, что Web Worker может работать с 100% загрузкой ЦП бесконечными циклами, не беспокоясь о зависании пользовательского интерфейса.Это означает, что веб-работник не может вызвать ужасное окно сообщения «Предупреждение: сценарий не отвечает»!

Компромисс отсутствия швартовки - это ваша способность синхронизировать и взаимодействовать между DOM и рабочими потоками.Явным каналом между работником и DOM является API postMessage () для отправки данных и событие onmessage для получения событий.Вы можете отправлять сообщения со строками и объектами, где ваши данные клонируются из кучи исходного потока в кучу целевого потока.События onmessage принимаются вашим веб-работником только в режиме ожидания.Это означает, что для своевременной доставки событий сообщения от DOM вашему веб-работнику, работник должен часто уступать;это может помешать написанию кода.

Важно понимать, что в современных реализациях JavaScript есть специальный класс «Переносимые объекты», где объекты, которые вы отправляете в postMessage ()не клонируется, а, скорее, право собственности на объект передается из одного потока в другой.Это типы данных, которые вы хотите отправить в postMessage (), когда это возможно;всякий раз, когда данные клонируются при вызове postMessage (), вы создаете TONS мусора, который будет GC'd, и производительность системы будет страдать.

Коллекция типов переносимых объектов постоянно растет, и Mozilla DevelopmentСеть, WhatWG и W3C - отличные места для наблюдения за исследованиями спецификаций в этой области.Я даже не могу рассказать вам обо всех вещах, которые в настоящее время могут передаваться между потоками в браузере, но если бы я составил вам полный список, он, вероятно, устареет через год или меньше.

Что касается вашего исходного вопроса, то в Firefox 44+ вы теперь можете частично передать Canvas в WebWorker через функцию HTMLCanvasElement # TransferControlToOffscreen.TransferControlToOffscreen создает объект Transferable OffscreenCanvas, который вы можете отправить в Web Worker.В Web Worker вы можете получить webgl CanvasContext и выдать команды рисования на холст из рабочего потока, не имея прямого доступа к фактическому DOM тега холста, который все еще существует в потоке DOM.

https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/transferControlToOffscreen

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

3 голосов
/ 02 февраля 2012

На этот вопрос есть ответ, в котором в основном говорится, что вы не можете использовать webgl от веб-работника, поскольку веб-работники не имеют доступа к DOM, и вам нужно вызвать getContext () на объекте canvas для получения контекста webgl.

...