我正在使用transferables在主线程和worker之间进行通信。我意识到通信创建了GC活动,因为在接收缓冲区后,我正在使用new关键字将缓冲区转换为类型化数组:
var ary = new Float32Array(buffer);
有没有办法重新使用TypedArray或获取缓冲区视图而不创建GC活动?
我不认为有,不。 ArrayBuffer
几乎是一个没有类型数组或DataView
的黑盒子来查看它,你不能改变现有类型数组或DataView
上的缓冲区。
在支持它的平台上,您可以创建主线程和工作线程都可以访问的SharedArrayBuffer
,这样就不会出现GC问题,因为每一方都会重用其包装器数组。只需确保您通过postMessage
或Atomics
(更多关于this question's answer中的信息)进入门户网站。
但遗憾的是,大多数浏览器都禁用了SharedArrayBuffer
以响应Spectre,而最后我检查的只有Chrome重新启用它(在启用了网站隔离功能的平台上)。