2

我正在使用 transferables 在主线程和工作线程之间进行通信。我意识到通信会创建 GC 活动,因为在接收到缓冲区后,我使用 new 关键字将缓冲区转换为类型化数组:

var ary = new Float32Array(buffer);

有没有办法在不创建 GC 活动的情况下重用 TypedArray 或获取缓冲区视图?

4

1 回答 1

1

我不认为有,没有。ArrayBuffer几乎是一个没有类型化数组或DataView查看它的黑盒子,您无法更改现有类型化数组或DataView.

在支持它的平台上,您可以创建一个SharedArrayBuffer主线程和工作线程都可以访问的,这不会有 GC 问题,因为每一方都会重用其包装器数组。只需确保您通过postMessageAtomics(有关此问题的答案中的更多信息)访问它。

但可悲的是,大多数浏览器SharedArrayBuffer都为响应 Spectre 而禁用,而我最后一次检查的只有 Chrome 重新启用了它(在启用其站点隔离功能的平台上)。

于 2019-03-24T18:07:29.600 回答