传递 Int32Array 而不是 SharedArrayBuffer 应该有效吗?

Is passing Int32Array instead of SharedArrayBuffer supposed to work?

我有一些代码可以创建共享数组缓冲区并将 Int32Array 而不是 SharedArrayBuffer 传递给工作人员:

let worker = new Worker(...);
worker.postMessage({
  position: {
    x: createArray(),
    y: createArray()
  },
  velocity: {
    x: createArray(),
    y: createArray()
  }
});

function createArray(size = 1024) {
  let buffer = new SharedArrayBuffer(size);
  return new Int32Array(buffer);
}

在 worker 中,我在整个数组的循环中更新生成的整数。

let components = e.data;

let velocityX = Atomics.load(components.velocity.x, shipEid);
let velocityY = Atomics.load(components.velocity.y, shipEid);
Atomics.add(components.position.x, shipEid, velocityX);
Atomics.add(components.position.y, shipEid, velocityY);

现在,我的问题是,将 Int32Array 而不是 SharedArrayBuffer 传递给工作人员是否有效?老实说,直到很久以后我才意识到我在这样做,现在我意识到了,我想知道为什么它会起作用。我认为您必须将 SharedArrayBuffer 传递给工作人员才能在工作人员和主进程之间共享内存。这实际上是规范的一部分以这种方式工作,还是 Chrome 特定的东西会破坏其他浏览器并可能在将来破坏 Chrome?

是的,这是有效的。请注意,您实际上也没有传递 Int32Array:您传递的对象具有的属性是具有类型化数组属性的对象。这是有效的,因为 argument to postMessage is actually structurally cloned, and when the cloning algorithm reaches the SharedArrayBuffer that is part of your structure then it is cloned into a new buffer object that shares the underlying memory.