我在主线程和物理工作者之间使用可转移对象。 Float32Array来回传递,效果很好。如何检查Float32Array是否被绝育?
例如,这是一个数组:
this.transferableArray = new Float32Array();
作为可转让对象发送
worker.postMessage(this.transferableArray, [this.transferableArray.buffer]);
目前在我的代码中,我检查它是否像那样绝育:
if (!transferableArray.length) {
return false;
}
这是正确的做法吗?还是有一些方法可以明确告诉阵列是否被绝育?这是一场游戏,所以每毫秒都很重要。
答案 0 :(得分:1)
发送数组后,它变得无用,所以现在我只是在发送后取消了该属性。
worker.postMessage(this.transferableArray, [this.transferableArray.buffer]);
this.transferableArray = undefined;
现在,在任何时候都可以通过检查
轻松检查它是否回来了if(!this.transferableArray) {
return;
}
答案 1 :(得分:1)
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 ) );