Baseline Widely available *
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 使ç¨ï¼æ¯å¦ï¼
WebGLRenderingContext.bufferData()
WebGLRenderingContext.bufferSubData()
WebGL2RenderingContext.getBufferSubData()
ç±äºå¹½çµæ¼æ´ï¼å ±äº«å ååé«ç²¾åº¦å®æ¶å¨å¨ 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 å ·æä¸åçå¯ç¨æ§ï¼
Atomics
å¯¹è±¡æ»æ¯å¯ç¨çãSharedArrayBuffer
对象å¨ååä¸å§ç»å¯ç¨ï¼ä½éæ¾çæ¯ï¼é¤é设置äºå颿å°ç两个æ 头ï¼å¦åå
¶å¨å
¨å±å¯¹è±¡ä¸çæé 彿°æ¯éèçï¼è¿æ¯ä¸ºäºå
¼å®¹ web å
容ãè¿ä¸ªéå¶ææå¨æªæ¥è¢«ç§»é¤ãå°½ç®¡å¦æ¤ï¼ä»ç¶å¯ä»¥ç¨ WebAssembly.Memory
æ¥è·åå®ä¾ãpostMessage()
ç API å¨å¤ç SharedArrayBuffer
对象æ¶ä¼æåºå¼å¸¸ã妿æ£ç¡®è®¾ç½®äºè¿ä¸¤ä¸ªæ 头ï¼Window
对象åä¸ç¨ worker 线ç¨ä¸ç postMessage()
é½å¯ä»¥æ£å¸¸å·¥ä½ï¼å¹¶å
许跨线ç¨å
±äº«å
åãWebAssembly.Memory
对象å¯ä»¥éè¿è®¾ç½® shared
æé 彿°æ å¿æ¥å建ãå½è¿ä¸ªæ å¿è®¾ç½®ä¸º true
æ¶ï¼æé åºç Memory
对象就å SharedArrayBuffer
䏿 ·ï¼å¯ä»¥éè¿ postMessage()
å¨ worker 线ç¨ä¹é´å
±äº«ï¼èä¸ Memory
对象çåå¤ buffer
æ¯ä¸ä¸ª SharedArrayBuffer
ãå æ¤ï¼ä¸è¿°å
³äºå¨ worker 线ç¨é´å
±äº« SharedArrayBuffer çè¦æ±åæ ·éç¨äºå
񄧮 WebAssembly.Memory
ã
WebAssembly Thread ææ¡è¿å®ä¹äºä¸å¥æ°çååæä»¤ãå°±å SharedArrayBuffer
åå
¶æ¹æ³å§ç»å¯ç¨ï¼å¹¶ä¸åªæå¨è®¾ç½®äºæ°æ 头çæ
åµä¸ï¼æå
许线ç¨é´å
±äº«ï¼ä¸æ ·ï¼WebAssembly ååæä»¤ä¹æ¯å§ç»å¯ç¨çã
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
为è´ï¼å宿¯ä»æ°ç»çæ«å°¾å¼å§çç´¢å¼ï¼è䏿¯æ°ç»çå¼å¤´ã
const sab = new SharedArrayBuffer(1024);
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);
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4