0

我在我的主线程和物理工作者之间使用可转移对象。Float32Array 来回传递,效果很好。如何检查 Float32Array 是否已绝育?

例如这是一个数组:

this.transferableArray = new Float32Array();

作为可转移对象发送

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

目前在我的代码中,我检查它是否像这样被绝育:

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

这是正确的方法还是有一些方法可以专门告诉数组是否已绝育?这是一个游戏,所以每一毫秒的增益都很重要。

4

2 回答 2

1

发送数组后它变得无用,所以现在我只是在发送后取消设置属性。

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

现在,在任何时候都可以通过检查轻松检查它是否返回

if(!this.transferableArray) {
    return;
}
于 2015-09-29T14:21:21.230 回答
1

在 99% 的情况下,检查0 .byteLength应该足够了。

如果你真的需要处理剩下的 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 ) );

于 2020-04-21T01:24:23.183 回答