Блокирует ли веб-работник в главном потоке некоторые функции OffscreenCanvas? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть веб-работник, обрабатывающий массив сохраненных ImageData фреймов, и я использую контекст OffscreenCanvas (созданный в веб-работнике) для putImageData. Тем временем в моем основном потоке я блокирую другую операцию. Если я включаю вызов context.putImageData(), веб-работник блокируется до завершения основного потока, прежде чем продолжить, но если я удалю вызов putImageData или использую context.clearRect(), веб-работник будет работать одновременно с моим основным потоком.

Даже если я работаю в веб-работнике, возможно ли, что веб-работник блокирует некоторые виды использования OffscreenCanvas? Это также происходит с convertToBlob.

1 Ответ

0 голосов
/ 29 апреля 2020

Не должно.

Но действительно существует регрессия, вызванная этой проблемой , которая затрагивает Chrome> 82.

Я действительно открыл сообщение об ошибке , так что теперь все, что мы можем сделать, это ждать, пока они это исправят.

Вот MCVE, который я произвел:

const worker_script = `
postMessage('ready'); // main will block
const now = performance.now();
const off = new OffscreenCanvas(300, 150);
const off_ctx = off.getContext('2d');
off_ctx.fillRect(0,0,30,30)
postMessage( performance.now() - now );
`;
const worker_url = URL.createObjectURL( new Blob( [ worker_script ], { type: "text/javascript" } ) );
const worker = new Worker( worker_url );

worker.onmessage = evt => {
  if (evt.data === "ready" ) {
    blockMainThread( 3000 )
      .then( () => log( 'now free' ) );
  }
  else log( `worker script took ${evt.data}ms to complete.` );
};

worker.postMessage( "" );

function blockMainThread( duration ) {
  return new Promise( ( resolve ) => {
    const now = performance.now();
    while( performance.now() - now < duration ) {}
    resolve();
  } );
}
function log( content ) {
  _log.textContent += content + '\n';
}

The page will be frozen for 3s. Please wait.

Учитывая природу этой ошибки, я сомневаюсь, что есть способ обойти ее.

...