经纬志
首页 / luma.gl / API 文档

CommandBuffer

先看结论

命令录制的成品:由 CommandEncoder.finish() 生成, 提交一次后即失效,只保留给调试与统计使用。

最后验证 2026-11-03 · luma.gl 9.4 · 更新 2026-10-29 · 引用本文
encoder.finish() → CommandBuffer

不直接构造,只能由编码器产出。

成员

成员说明
id继承自编码器,便于把命令缓冲与录制阶段对应起来
userData继承自编码器的应用自定义数据
handle底层句柄,WebGPU 下是原生命令缓冲
device所属设备
destroyed是否已释放

方法

方法说明
destroy()释放命令缓冲占用的资源

提交

const encoder = device.createCommandEncoder({ id: 'gbuffer' });

const pass = encoder.beginRenderPass({
  framebuffer: fbo,
  clearColor: [0, 0, 0, 1]
});
pass.setPipeline(pipeline);
pass.setVertexArray(vertexArray);
pass.draw({ vertexCount: 36 });
pass.end();

const commandBuffer = encoder.finish();

device.submit(commandBuffer);

一条命令缓冲只能提交一次。重复提交不会执行第二遍, 部分后端会直接报错。需要重复执行相同命令时重新录制, 或改用 RenderBundle(仅 WebGPU)。

记录用途

id 与 userData 不参与执行,只用于排查。 帧编号、渲染阶段名、耗时统计都可以挂在上面, 在浏览器性能面板里更容易对应到具体代码段:

const encoder = device.createCommandEncoder({
  id: 'frame-' + frameIndex,
  userData: { pass: 'terrain', frame: frameIndex }
});

/* ……录制…… */

const cb = encoder.finish();
device.submit(cb);
cb.destroy();

生命周期

阶段状态
finish() 之后不可变,可以提交
submit() 之后已消费,不能再次提交
destroy() 之后句柄释放,对象不可再用

不调用 destroy 时,命令缓冲随垃圾回收释放, 但显存回收时机不确定。每帧产出的场景里显式释放更稳。

不要跨帧保存命令缓冲。 命令里引用的缓冲区与纹理可能已在下一帧被改写, 即使句柄仍然有效,执行内容也不再是录制时的状态。 需要复用录制结果时,考虑 WebGPU 的渲染束。

引用本文

经纬志(2026)。《CommandBuffer》。https://www.jingweizhi.com/lumagl/api/command-buffer.html(访问日期 2026-11-03)。