SharedArrayBuffer
åºçº¿
广æ³å¯ç¨
*
èª 2021å¹´12æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
SharedArrayBuffer å¯¹è±¡ç¨æ¥è¡¨ç¤ºä¸ä¸ªéç¨çåå§äºè¿å¶æ°æ®ç¼å²åºï¼ç±»ä¼¼äº ArrayBuffer 对象ï¼ä½å®å¯ä»¥ç¨æ¥å¨å
±äº«å
åä¸å建è§å¾ãä¸å¯è½¬ç§»ç ArrayBuffer ä¸åï¼SharedArrayBuffer 䏿¯å¯è½¬ç§»å¯¹è±¡ã
æè¿°
è¦å¨é群ä¸çä¸ä¸ªä»£çï¼agentï¼å¯ä»¥æ¯ç½é¡µç主ç¨åºæå
¶ä»»æä¸ä¸ª web workerï¼ä¸å¦ä¸ä¸ªä»£çä¹é´ä½¿ç¨ ShareArrayBuffer å
±äº«å
åï¼éè¦ä½¿ç¨ postMessage åç»æåå
éã
ç»æåå
éç®æ³æ¥å SharedArrayBuffer å¯¹è±¡åæ å°å° SharedArrayBuffer 对象çç±»ååæ°ç»ãå¨è¿ä¸¤ç§æ
åµä¸ï¼ SharedArrayBuffer 对象ä¼è¢«ä¼ è¾ç»æ¥æ¶è
ï¼ä»è卿¥æ¶ä»£çä¸äº§çä¸ä¸ªæ°çãç§æç SharedArrayBuffer 对象ï¼å°±å ArrayBuffer 䏿 ·ï¼ã使¯ï¼ä¸¤ä¸ª SharedArrayBuffer 对象æåçå
±äº«æ°æ®åå
¶å®æ¯åä¸ä¸ªæ°æ®åï¼ä¸ä¸ªä»£çä¸å¯¹æ°æ®åçä¿®æ¹æç»ä¼å°å¨å¦ä¸ä¸ªä»£çä¸å¯è§ã
const sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
å ±äº«å åå¯ä»¥è¢« worker çº¿ç¨æä¸»çº¿ç¨å建ååæ¶æ´æ°ãæ ¹æ®ç³»ç»ï¼CPUãæä½ç³»ç»ãæµè§å¨ï¼çä¸åï¼éè¦ä¸æ®µæ¶é´æè½å°ååä¼ éç»ææä¸ä¸æç¯å¢ãå æ¤éè¦éè¿ååæä½æ¥è¿è¡åæ¥ã
SharedArrayBuffer 被ä¸äº web API 使ç¨ï¼æ¯å¦ï¼
å®å ¨éæ±
ç±äºå¹½çµæ¼æ´ï¼å ±äº«å ååé«ç²¾åº¦å®æ¶å¨å¨ 2018 å¹´ 1 æ 5 æ¥å¼å§è¢«ç¦ç¨ãå¨ 2020 å¹´ï¼ä¸ç§æ°çãå®å ¨çæ¹æ³å·²ç»è¢«æ ååï¼ä»¥éæ°å¯ç¨å ±äº«å åã
ä½ä¸ºåºæ¬è¦æ±ï¼ä½ çææ¡£éè¦å¤äºä¸ä¸ªå®å ¨ä¸ä¸æä¸ã
对äºé¡¶çº§ææ¡£ï¼éè¦è®¾ç½®ä¸¤ä¸ªæ 头æ¥å®ç°ä½ ç½ç«çè·¨æºé离ï¼
Cross-Origin-Opener-Policy设置为same-originï¼æ¥ä¿æ¤ä½ çæºç«ç¹å åæ»å»ï¼Cross-Origin-Embedder-Policy设置为require-corpæcredentiallessï¼ä¿æ¤å害è å åä½ çæºç«ç¹çå½±åï¼
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
为äºéªè¯è·¨æºé离æ¯å¦çæï¼ä½ å¯ä»¥æµè¯çªå£å worker ä¸ä¸æä¸ç Window.crossOriginIsolated æ WorkerGlobalScope.crossOriginIsolated 屿§ï¼
const myWorker = new Worker("worker.js");
if (crossOriginIsolated) {
const buffer = new SharedArrayBuffer(16);
myWorker.postMessage(buffer);
} else {
const buffer = new ArrayBuffer(16);
myWorker.postMessage(buffer);
}
å¨è®¾ç½®äºè¿ä¸¤ä¸ªæ 头åï¼postMessage() ä¸å为 SharedArrayBuffer 对象æåºé误ï¼å æ¤ï¼è·¨çº¿ç¨å
±äº«å
åç°å¨å¯ç¨ã
åµå¥ææ¡£åä¸ç¨ worker 线ç¨ä¹éè¦å° Cross-Origin-Embedder-Policy æ å¤´è®¾ç½®ä¸ºåæ ·çå¼ã对äºåæºåµå¥ææ¡£ååèµæºï¼ä¸éè¦è¿è¡ä»»ä½å
¶ä»æ´æ¹ãåç«ï¼ä½è·¨æºï¼åµå¥ææ¡£ååèµæºéè¦å° Cross-Origin-Resource-Policy æ 头设置为 same-siteãèå®ä»¬çè·¨æºï¼åè·¨ç«ç¹ï¼ç对åºé¨åä¹éè¦å°åæ ·çæ å¤´è®¾ç½®ä¸º cross-originã请注æï¼å° Cross-Origin-Resource-Policy æ å¤´è®¾ç½®ä¸ºé¤ same-origin ä¹å¤çä»»ä½å¼ï¼é½ä¼ä½¿èµæºæ´é²äºæ½å¨çæ»å»ä¸ï¼æ¯å¦å¹½çµæ¼æ´ã
请注æï¼Cross-Origin-Opener-Policy æ 头ä¼éå¶ä½ 对弹åºçªå£å¼ç¨çä¿çè½åã两个顶级çªå£ä¸ä¸æä¹é´çç´æ¥è®¿é®åºæ¬ä¸åªå¨å®ä»¬åæºä¸æºå¸¦ç¸åç两个æ 头ï¼ä¸å
·æç¸åçå¼ï¼æ¶æå¯è¡ã
API å¯ç¨æ§
æ ¹æ®æ¯å¦éåäºä¸è¿°å®å ¨æªæ½ï¼åç±»å åå ±äº« API å ·æä¸åçå¯ç¨æ§ï¼
Atomicså¯¹è±¡æ»æ¯å¯ç¨çãSharedArrayBuffer对象å¨ååä¸å§ç»å¯ç¨ï¼ä½éæ¾çæ¯ï¼é¤é设置äºå颿å°ç两个æ 头ï¼å¦åå ¶å¨å ¨å±å¯¹è±¡ä¸çæé 彿°æ¯éèçï¼è¿æ¯ä¸ºäºå ¼å®¹ web å 容ãè¿ä¸ªéå¶ææå¨æªæ¥è¢«ç§»é¤ãå°½ç®¡å¦æ¤ï¼ä»ç¶å¯ä»¥ç¨WebAssembly.Memoryæ¥è·åå®ä¾ã- é¤é设置äºä¸ææå°ç两个æ 头ï¼å¦ååç§
postMessage()ç API å¨å¤çSharedArrayBuffer对象æ¶ä¼æåºå¼å¸¸ã妿æ£ç¡®è®¾ç½®äºè¿ä¸¤ä¸ªæ 头ï¼Window对象åä¸ç¨ worker 线ç¨ä¸çpostMessage()é½å¯ä»¥æ£å¸¸å·¥ä½ï¼å¹¶å 许跨线ç¨å ±äº«å åã
WebAssembly å ±äº«å å
WebAssembly.Memory 对象å¯ä»¥éè¿è®¾ç½® shared æé 彿°æ å¿æ¥å建ãå½è¿ä¸ªæ å¿è®¾ç½®ä¸º true æ¶ï¼æé åºç Memory 对象就å SharedArrayBuffer 䏿 ·ï¼å¯ä»¥éè¿ postMessage() å¨ worker 线ç¨ä¹é´å
±äº«ï¼èä¸ Memory 对象çåå¤ buffer æ¯ä¸ä¸ª SharedArrayBufferãå æ¤ï¼ä¸è¿°å
³äºå¨ worker 线ç¨é´å
±äº« SharedArrayBuffer çè¦æ±åæ ·éç¨äºå
±äº« WebAssembly.Memoryã
WebAssembly Thread ææ¡è¿å®ä¹äºä¸å¥æ°çååæä»¤ãå°±å SharedArrayBuffer åå
¶æ¹æ³å§ç»å¯ç¨ï¼å¹¶ä¸åªæå¨è®¾ç½®äºæ°æ 头çæ
åµä¸ï¼æå
许线ç¨é´å
±äº«ï¼ä¸æ ·ï¼WebAssembly ååæä»¤ä¹æ¯å§ç»å¯ç¨çã
å¢å¤§ SharedArrayBuffer
SharedArrayBuffer 对象å¯ä»¥éè¿å¨è°ç¨ SharedArrayBuffer() æ¶å
å« maxByteLength é项æ¥ä½¿å
¶å¯å¢å¤§ãä½ å¯ä»¥éè¿è®¿é® SharedArrayBuffer ç growable å maxByteLength 屿§æ¥å嫿¥è¯¢å
¶æ¯å¦å¯å¢å¤§ä»¥åå
¶æå¤§å¤§å°ãä½ è¿å¯ä»¥éè¿è°ç¨ grow() 为ä¸ä¸ªå¯å¢å¤§ç SharedArrayBuffer åé
æ°ç大å°ãæ°åè被åå§å为 0ã
è¿äºç¹æ§ä»¤å¢å¤§ SharedArrayBuffer æ´ä¸ºé«æââå¦åï¼ä½ å¿
é¡»å建ä¸ä¸ªæ°å¤§å°çç¼å²åºå¯æ¬ãå®è¿ä½¿å¾ JavaScript å¨è¿æ¹é¢ä¸ WebAssembly ä¿æä¸è´ï¼Wasm 线æ§å
åå¯ä»¥éè¿ WebAssembly.Memory.prototype.grow() è°æ´å¤§å°ï¼ã
åºäºå®å
¨åå ï¼SharedArrayBuffer ç大尿 æ³ç¼©å°ï¼åªè½å¢å¤§ã
æé 彿°
-
å建ä¸ä¸ªæ°ç
SharedArrayBuffer对象ã
éæå±æ§
-
è¿åç¨äºæé
SharedArrayBufferæ¹æ³è¿åå¼çæé 彿°ã
å®ä¾å±æ§
屿§å®ä¹äº SharedArrayBuffer.prototype å¹¶ä¸è¢«ææ SharedArrayBuffer å®ä¾æå
±äº«ã
-
æ°ç»å¤§å°ï¼ä»¥åè为åä½ãå¨æé æ°ç»æ¶è¢«ç¡®å®ï¼å¹¶ä¸åªè½å¨å¯å¢å¤§ç
SharedArrayBufferä¸éè¿SharedArrayBuffer.prototype.grow()æ¹æ³æ¥æ¹åã -
å建å®ä¾å¯¹è±¡çæé 彿°ã对äº
SharedArrayBufferå®ä¾ï¼å ¶åå§å¼ä¸ºSharedArrayBufferæé 彿°ã -
åªè¯»ã妿å½å
SharedArrayBufferå¯ä»¥å¢å¤§ï¼åè¿åtrueï¼å¦åè¿åfalseã -
å½å
SharedArrayBufferå¯ä»¥å¢å¤§çæå¤§é¿åº¦ï¼åªè¯»ï¼ä»¥åè为åä½ãå¨æé æ°ç»æ¶ç¡®å®ä¸æ æ³æ´æ¹ã -
[Symbol.toStringTag]屿§çåå§å¼æ¯å符串"SharedArrayBuffer"ãå®è¢«ç¨äºObject.prototype.toString()ã
å®ä¾æ¹æ³
-
å¢å¤§å½å
SharedArrayBufferå°æå®å¤§å°ï¼ä»¥åè为åä½ã -
è¿åä¸ä¸ªæ°ç
SharedArrayBufferï¼å ¶å 容æ¯å½åSharedArrayBufferä»beginï¼å«ï¼å°endï¼ä¸å«ï¼çåèç坿¬ã妿beginæend为è´ï¼å宿¯ä»æ°ç»çæ«å°¾å¼å§çç´¢å¼ï¼è䏿¯æ°ç»çå¼å¤´ã
示ä¾
>å建ä¸ä¸ªæ°ç SharedArrayBuffer
const sab = new SharedArrayBuffer(1024);
æªå SharedArrayBuffer
sab.slice(); // SharedArrayBuffer { byteLength: 1024 }
sab.slice(2); // SharedArrayBuffer { byteLength: 1022 }
sab.slice(-2); // SharedArrayBuffer { byteLength: 2 }
sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }
å¨ WebGL buffer ä¸ä½¿ç¨
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, sab, gl.STATIC_DRAW);
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-sharedarraybuffer-objects> |
æµè§å¨å ¼å®¹æ§
åè§
AtomicsArrayBuffer- JavaScript ç±»ååæ°ç»æå
- Web Workers
- å ±äº«å åââç®ææç¨ï¼TC39 ecmascript-sharedmem ææ¡
- JavaScript æ°å¹¶ååè¯çåä½éªï¼hacks.mozilla.orgï¼2016ï¼
- COOP å COEP çè§£éï¼ç± Chrome å¢éæ°åï¼2020ï¼
Cross-Origin-Opener-PolicyCross-Origin-Embedder-PolicyCross-Origin-Resource-PolicyWindow.crossOriginIsolatedåWorkerGlobalScope.crossOriginIsolated- Android Chrome 88 åæ¡é¢ç Chrome 92 ä¸ç SharedArrayBuffer æ´æ°ï¼developer.chrome.google.cnï¼2021ï¼