Tengo un código que crea un búfer de matriz compartido y pasa Int32Array
y NO SharedArrayBuffer
al trabajador:
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); }
En el trabajador estoy actualizando los enteros resultantes en un bucle a través de la matriz.
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);
Ahora, mi pregunta es, ¿es válido pasar Int32Array
al trabajador en lugar de SharedArrayBuffer
? Honestamente, ni siquiera me di cuenta de que estaba haciendo esto hasta mucho más tarde, y ahora que me doy cuenta, me pregunto por qué funciona. Pensé que tenía que pasar SharedArrayBuffer
al trabajador para compartir la memoria entre el trabajador y el proceso principal. ¿Es esto realmente parte de la especificación para que funcione de esta manera, o es algo específico de Chrome que fallará para otros navegadores y posiblemente fallará en Chrome en el futuro?
Sí, esto es válido. Tenga en cuenta que en realidad tampoco está pasando el Int32Array
: está pasando un objeto que tiene propiedades que son objetos que tienen propiedades que son matrices escritas. Esto funciona porque el argumento de postMessage
en realidad está clonado estructuralmente , y cuando el algoritmo de clonación alcanza el SharedArrayBuffer
que es parte de su estructura, entonces se clona en un nuevo objeto de búfer que comparte la memoria subyacente .