传递 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.
我有一些代码可以创建共享数组缓冲区并将 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.