关于 reduce-draw-calls
此图形优化 Skill 指导开发者测量并减少绘制调用,并在适用时使用批处理或硬件实例化。它还建议进行像素验证,以检查渲染图像是否保持不变。
主要功能
- 01测量绘制调用数量
- 02禁用隐藏元素
- 03使用 BatchManager 分组几何体
- 04采用硬件实例化
- 05通过像素验证检查渲染
适用场景
- 01诊断绘制调用瓶颈
- 02批处理静态或动态几何体
- 03渲染同一网格的多个副本
- 04优化后验证视觉输出
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ playcanvas/ skills --skill reduce-draw-calls安装后在 Claude Code 中输入/reduce-draw-calls确认已加载。
详细介绍
减少 draw call
先用 app.stats.drawCallCount 或 MiniStats 进行测量;按 pass 细分的 app.stats.drawCalls
明细仅在 profiler 构建中填充。此外,将像素比减半并调用 app.resizeCanvas():
如果帧时间下降,说明瓶颈是填充率,而不是 draw call。在满足预算的第一个层级就停止,并报告优化前后的数量。
1. 停止绘制隐藏对象
不透明度为 0 的元素仍会被绘制。请设置 enabled = false。
2. BatchManager
调用 app.batcher.addGroup(name, dynamic, maxAabbSize),然后在 render、sprite
或 element 组件上设置 batchGroupId。对于永不移动的几何体,使用 dynamic: false。成员在实时树中被启用时加入,顺序不限,且当成员关系变化时分组会自动重新生成。仅在移动静态分组的成员后调用 markGroupDirty(id)。手动 AppOptions
引导必须设置 batchManager。
3. 硬件实例化
适用于同一 mesh 和材质的大量副本,且每帧变换不同的情况。使用
VertexFormat.getDefaultInstancingFormat(device) 构建缓冲区,每个实例一个 mat4,并调用
meshInstance.setInstancing(vb);instancingCount 随缓冲区而定。
没有逐实例剔除。默认情况下该分组始终绘制;setInstancing(vb, true)
会将其作为一个整体,针对覆盖所有实例的 RenderComponent#customAabb 进行剔除。将大型
实例集拆分为空间块。自定义顶点块需要 INSTANCING 路径
(override-shader-chunks)。从 graphics/instancing-basic 和
graphics/instancing-custom 示例开始。
使用 verify-pixels 确认图像未发生变化。