JavaScript Float32Array проверка, если передаваемый объект кастрирован

Я использую переносимые объекты между моим основным потоком и физическим работником. Float32Array передается взад-вперед и работает довольно хорошо. Как проверить, что Float32Array кастрирован?

Например, это массив:

this.transferableArray = new Float32Array();

Отправить как передаваемый объект

worker.postMessage(this.transferableArray, [this.transferableArray.buffer]);

В настоящее время в моем коде я проверяю, не кастрирован ли он так:

if (!transferableArray.length) {
    return false;
}

Это правильный способ сделать это или есть какой-то метод, который определенно сообщает, если массив стерилизован? Это игра, так что каждая миллисекунда имеет значение.

1 ответ

После отправки массива он становится бесполезным, так что теперь я просто сбрасываю свойство после отправки.

worker.postMessage(this.transferableArray, [this.transferableArray.buffer]);
this.transferableArray = undefined;

теперь, в любой момент времени можно легко проверить, вернулась ли она, проверив

if(!this.transferableArray) {
    return;
}

Проверка на 0 .byteLength должно хватить в 99% случаев.

Если вам действительно нужно обработать оставшийся 1%, вы можете попробовать назвать его slice() метод, который будет сгенерирован, если ArrayBuffer отсоединен.

function isDetached( arrayBuffer ) {
  if( arrayBuffer.byteLength > 0 ) { return false; }
  try {
    arrayBuffer.slice( 0, 0 );
    return false;
  }
  catch( e ) {
    return true;
  }
}

const arr = new Float32Array( 0 );

console.log( 'before transfer:', isDetached( arr.buffer ) );

// transfer
const channel = new MessageChannel();
channel.port1.postMessage( arr, [ arr.buffer ] );

console.log( 'after transfer:', isDetached( arr.buffer ) );

Другие вопросы по тегам