Skip to content

ArrayBuffer、TypedArray、Transferable 与 SharedArrayBuffer ​

四种语义不要混用 ​

机制此仓库用途所有权/复制
Structured Clone协议中的小型 JSON payload结构复制
TypedArray ViewPCM、波形、WASM ABI解释同一 buffer 的类型/区间
TransferableWorker 大 ArrayBuffer、VideoFrame所有权转移;发送方 buffer detached
SharedArrayBuffer播放时钟、音频环形缓冲实验双方共享;必须 Atomics + 隔离

TransferOwnershipLedger.begin() 在 postMessage 前记录原始 byteLength,complete() 要求 非空 ArrayBuffer 已变成 byteLength === 0。发送方后续调用 assertOwned 会失败, 防止把 detached buffer 当成有效数据继续使用。

WASM 输入 &[f32] / &[u8] 由 wasm-bindgen 暴露为 Float32Array / Uint8Array;波形输出 布局固定为 [min buckets][max buckets][rms buckets],TS 用 subarray 建 view,不再次 拆成对象数组。

SAB 时钟与降级 ​

共享时钟用 4 个 Int32:sequence、state、time low、time high。写入前后将 sequence 变奇数/偶数;读取方只有前后 sequence 一致才接受快照。环形缓冲也只写完整声道帧。 没有 crossOriginIsolated、SharedArrayBuffer 或 Atomics 时,工厂返回 message 模式, 功能保留但不是共享内存。

复现与预期输出 ​

bash
pnpm test
text
UI: SyncDebugPanel 显示 clockTransportMode shared;无隔离时为 message
Console: Transfer 只记录 byteLength/type,不打印原始 PCM/packet
CLI: detached buffer、SAB clock、ring buffer 测试通过

浏览器 Console 可验证隔离:

js
console.log(crossOriginIsolated, typeof SharedArrayBuffer, typeof Atomics);

预期基准开发服务输出:

text
true "function" "object"

源码证据 ​