首页 / luma.gl / API 文档
CommandBuffer
先看结论
命令录制的成品:由 CommandEncoder.finish() 生成,
提交一次后即失效,只保留给调试与统计使用。
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)。