经纬志
首页 / luma.gl / 使用示例

缓冲区数据更新

二百个顶点连成一条波浪线,每帧重算纵坐标并整体写入缓冲区。 这是动态数据最基本的形态:几何不变,位置在变。

luma.gl 9.4 · 更新 2026-10-27
源码与运行效果
运行效果

说明

顶点沿 X 轴均匀排开,Y 由正弦函数决定,X 越靠边振幅越小,形成两端收窄的波浪。 每帧把 count × 3 个浮点数写回同一块 CPU 数组,再调用 buffer.write(data) 上传。缓冲区在创建时就声明了 VERTEX | COPY_DST,允许反复写入。

图元类型是 line-strip,顶点按顺序连成一条折线,首尾不闭合。 换成 line-list 会变成每两个点一段的断线,视觉上完全不同。

配置取值说明
顶点数200每帧上传 2400 字节
图元line-strip相邻顶点依次相连
用途VERTEX | COPY_DST声明为可写,WebGPU 迁移时同样成立
更新方式整段覆盖点数固定时最简单可靠
振幅0.1 – 0.6滑杆实时改参数,下一帧生效
频率2 – 12控制波峰数量

为什么不用每帧新建缓冲区

每帧 createBuffer 会不断申请显存、产生新的资源对象,旧的还要手动销毁。 正确做法是复用同一块缓冲,只更新内容。顶点数固定时,整段覆盖是最省心的方案; 顶点数会变化时,才需要重建缓冲区或使用可扩容的动态缓冲。

整段覆盖的代价

200 个顶点只有 2.4 KB,整段上传的开销可以忽略。 数据量到几十万个顶点时,每帧全量上传会占用大量带宽。 这时应当只更新变化区间,使用 write(data, byteOffset) 指定偏移,或改用支持分段更新的动态缓冲。

暂停与恢复

「暂停」只是停止重算与上传,渲染循环仍在运行,最后一帧的画面保持在画布上。 如果连渲染也想省掉,可以在暂停时跳过整个渲染通道; 但画布内容在部分浏览器上可能被清空,需要保留最后一帧的纹理作为兜底。

先声明用途,再写入。只在 WebGL 上开发时,漏写 COPY_DST 通常也能跑;迁移到 WebGPU 后,写入会被拒绝。用途标志从一开始就写全,后续不用返工。