TypedArray 通过 Uint32Array/Float32Array 扁平化存储坐标与节点元数据,消除对象开销和 GC 压力,提升 Quadtree 构建、遍历与查询性能;采用量化整数比较、预分配缓冲区、栈模拟递归及 SIMD 加速实现高效空间索引。

TypedArray 本身不直接提供空间索引能力,但它能为 Quadtree 等结构提供底层高性能内存支持——关键在于用 Uint32Array 或 Float32Array 替代普通数组存储坐标与节点元数据,避免 GC 压力和内存碎片,让树遍历、批量插入/查询真正跑在“裸内存”上。
用 TypedArray 扁平化存储坐标点
不要把每个点存成 {x: number, y: number} 对象。改用连续的 Float32Array 按 x₀, y₀, x₁, y₁, … 排列:
- 初始化:假设 100 万个点 → 分配
new Float32Array(2_000_000) - 写入第 i 个点:
coords[i * 2] = x; coords[i * 2 + 1] = y - 优势:零对象开销、CPU 缓存友好、可直接传给 WebGL 或 WASM
Quadtree 节点元数据用 Uint32Array 紧凑编码
每个节点只需存边界(minX, minY, maxX, maxY)和子节点索引(0 表示空),共 5 个整数。用 Uint32Array 每节点占 5 个 slot:
- slot[0] = minX(量化为 uint32,如乘 1000 后取整)
- slot[1] = minY
- slot[2] = maxX
- slot[3] = maxY
- slot[4] = 子节点起始偏移(若为叶子则为 0;非 0 时指向 children 数组中第 0 个子节点位置)
- children 数组也用 Uint32Array,每 5 个元素一组对应一个子节点
批量构建时跳过 JS 对象分配
传统递归建树易触发频繁 GC。改为“两阶段”构造:
- 第一阶段:扫描所有点,统计各层级候选区域数量,预分配足够大的 TypedArray(如 nodes = new Uint32Array(maxNodes * 5))
- 第二阶段:用栈模拟递归,所有节点写入预分配 buffer,索引用整数算术(如
childOffset = parentIdx * 5 + 4)计算,全程无 new Object - 插入新点时,只更新对应叶子节点的计数或点索引列表(可用另一个 Uint32Array 存叶子内点 ID 偏移)
查询优化:SIMD 友好边界检测 + 位掩码裁剪
查矩形范围时,避免逐个解包浮点坐标:
- 将查询框也量化为 uint32(同坐标缩放因子),用整数比较判断相交:
nodeMinX = queryMinX - 对叶子节点中的点批处理:用 WebAssembly SIMD 或 for-of + Float32Array.subarray() 流式读取,配合
Math.abs(x - cx) 类条件向量化过滤 - 若点集稀疏,可额外维护一个 bitset(Uint8Array)标记活跃点 ID,加速“存在性查询”










