进阶
架构模式
- 分区化布局:使用
MemoryManager将一个 SAB 按功能划分为vertices/indices/uvs/normals等分区(api/core/memory.ts:1),通过alloc(region, size, align)实现对齐分配与复用。 - 复合缓冲:
SharedModelBuffer在构造时计算各段字节大小并统一管理偏移,提供类型视图访问(api/model/index.ts:1),适合渲染与几何处理。 - WASM 协作:数值计算通过 Rust/wasm 执行,JS 侧以
TypedArray视图零拷贝传递(api/math/math.ts:1与src/math/mod.rs:1)。
并发与同步
- Atomics 原语:使用
Int32Array配合Atomics.store/load/add/sub/compareExchange/wait/notify管理生产者-消费者同步。 - 环形缓冲设计:以固定容量数组作为队列,使用两个原子索引
head/tail维护入队与出队,容量使用 2 的幂以便位运算取模。 - 回压与速率控制:在消费者处理速度不足时,生产者通过
Atomics.wait阻塞或丢弃策略避免无限增长。
示例(信号位):
ts
const buf = new SharedArrayBuffer(1024);
const signals = new Int32Array(buf, 0, 4);
const data = new Float32Array(buf, 16);
function producer() {
data[0] = 3.14;
Atomics.store(signals, 0, 1);
Atomics.notify(signals, 0, 1);
}
function consumer() {
while (Atomics.load(signals, 0) === 0) Atomics.wait(signals, 0, 0);
const v = data[0];
Atomics.store(signals, 0, 0);
return v;
}零拷贝数据流(WASM + Worker)
组合使用共享内存、Worker 与 WASM:
ts
import { Worker } from 'node:worker_threads';
import { SharedMemoryBase } from 'wasm-memx';
import { Math3D } from 'wasm-memx';
const mem = new SharedMemoryBase(64 * 1024);
const buf = mem.getBuffer();
const a = new Float32Array(buf, 0, 3);
const b = new Float32Array(buf, 12, 3);
const out = Math3D.vec3Add(a, b);
const worker = new Worker('./worker.js', { workerData: buf });性能优化要点
- 视图重用:避免频繁创建
TypedArray,重用长寿命视图,减少 GC 压力。 - 对齐与类型:按 4/8 字节对齐;确保数值类型与 WASM 侧一致(
f32/u32等)。 - 批处理:合并小型操作为批次,减少
postMessage次数与调度开销。 - COOP/COEP:浏览器中启用跨源隔离以确保
SharedArrayBuffer可用(见安装章节,examples/web/vite.config.js:1)。
调试与验证
- 共享验证:
view.buffer === otherView.buffer用于确认两个视图引用同一 SAB。 - 越界检测:为分区分配实现边界检查与断言,避免未定义行为(参考
alloc内逻辑,api/core/memory.ts:1)。 - 数据探针:在关键路径加入轻量级日志或可视化(如统计
Atomics.wait次数),定位瓶颈。
可选:手动实例化 WASM 与共享内存
如需显式传入共享内存给 WASM,可参考加载器示例(api/core/wasm-loader.ts:1)。
