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 ) );