当前位置: 首页 > news >正文

Draw Call 优化

draw call 多会卡,本质是 CPU 向 GPU 提交命令的开销太高,不只是“画得多”,而是“调度成本高”。

Draw Call 优化核心目标:减少提交次数、减少状态切换、避免无效提交。

1. 什么是 Draw Call

一次 draw call,通常就是一次:

gl.drawElements(...)

或在 Three.js 里对应一次 mesh 的提交。

每一次提交,浏览器/驱动/GPU 都要走一整套流程:

  • 设置 shader(program 切换)
  • 绑定材质状态(blend、depthTest 等)
  • 绑定纹理
  • 绑定顶点 buffer
  • 上传 uniform
  • 驱动校验状态
  • CPU 发命令给 GPU

这些都不是“免费”的。

2. 为什么多了会卡(核心原因)

(1)CPU 成为瓶颈

很多人以为渲染卡是 GPU 不够,其实常见是 CPU 卡。

如果有:

  • 10000 个 mesh
  • 每个 mesh 一个 drawcall

那每帧 CPU 要发 10000 次命令。

60 FPS:

10000 × 60 = 60万次提交/秒

CPU 光“派活”就忙不过来。

(2)Driver Call 很贵

真正贵的是驱动层(Driver Overhead)。

一次 drawcall 不是简单函数调用:

JS → WebGL API → 浏览器图形层 → GPU Driver → GPU Command Buffer

中间很多验证与状态同步。

所以:

小物体很多 = 往往比一个大物体更慢

哪怕总三角面一样。

3. 状态切换也贵

如果每个 drawcall 还切:

  • 材质
  • shader
  • 纹理
  • blend mode

会更慢:

drawcall 多 + state change 多 = 双重灾难

这也是为什么材质合批很重要。

4. GPU 也会被“喂不饱”

CPU 提交太慢:

GPU 等 CPU 发命令

GPU 空闲但帧率低。

这叫:

CPU-bound rendering

性能分析经常看到:

  • GPU 占用不高
  • 帧率却低

就是这个。

5. 举例

情况 A

10000 个 cube

10000 drawcalls
每个12个三角形

很可能卡。


情况 B

合成一个 geometry:

1 drawcall
12万个三角形

反而更快。

因为:

提交成本 << 顶点计算成本

6. Three.js 为什么常强调减少 Draw Call

因为 WebGL 尤其敏感。

经验:

DrawCalls 情况
<100 很轻松
100~500 常见
1000+ 开始危险
3000+ 容易卡
10000+ 通常有问题

(场景复杂度不同会变化)

 

 

 

一、最有效的优化手段

1)Instancing(批量实例化,收益最大)

适合大量重复模型:

  • 树、路灯、楼
  • 点位 marker
  • 粒子/传感器
  • 重复设备

Three.js 中:

const mesh = new THREE.InstancedMesh(geometry,material,10000
);

原来:

10000 objects
10000 draw calls

可能变成:

1 draw call

 

原理

同一个:

  • Geometry
  • Material
  • Shader

只提交一次,GPU画很多实例。

2)Merge Geometry(静态合批)

静态对象合并:

BufferGeometryUtils.mergeGeometries()

例如:

1000墙体 -> 1个Mesh
1000 drawcalls -> 1

适合:

  • 建筑
  • 地块
  • 静态装饰

3)共享材质(减少状态切换)

很多时候卡的不只是 drawcall,而是:

  • Program 切换
  • Material 切换
  • Texture 切换

避免:

new MeshStandardMaterial() // 一万个

改成复用同一个 material。

4)纹理图集(Texture Atlas)

原来:

100个模型
100张贴图
100次切换

改:

1张图集
1套材质

明显减少状态变化。

二、减少“无效 Draw Call”

5)Frustum Culling(视锥裁剪)

看不到别提交。

屏幕只看到300个
没必要提交5000个

Three.js 默认有基础裁剪。

还能做:

  • Chunk culling
  • Portal culling
  • Occlusion culling

6)LOD

远处降模:

近:

10000 triangles

远:

500 triangles

甚至 billboard。


7)隐藏对象别只设 visible,还要避免提交

很多人只:

mesh.visible = false

但大型系统可以进一步:

  • chunk卸载
  • 实例池回收
  • 动态加载

三、减少状态切换

有时 drawcall 不高也卡,是 state change。

避免频繁切:

  • shader
  • blend
  • depth
  • shadow

按材质排序渲染:

同材质一起画

比乱序快。

四、透明对象特别注意

透明经常破坏批处理:

透明对象可能需要单独排序

会导致:

  • drawcall上涨
  • overdraw上涨

尽量少透明。

五、高级方案(面试加分)

GPU Driven

更高级:

  • Multi Draw
  • Indirect Draw
  • GPU Culling
  • Clustered Rendering
  • WebGPU GPU-driven

这是现代渲染路线。

 

六、Three.js 实战排查

看 drawcall:

console.log(renderer.info.render.calls)

比如:

calls: 4200

说明该优化了。

经验值(大概):

DrawCalls 状态
<100 很轻
100-500 常见
1000+ 危险
3000+ 容易卡

七、优化优先级(实战)

优先做:

1 InstancedMesh
2 Geometry Merge
3 共享材质 + 图集
4 Frustum Culling
5 LOD

通常解决 80% 问题。

一句话总结

能批处理就批处理
能合并就合并
看不见别画
远处少画
少切状态

Draw Call 优化主要从批处理(Instancing、Merge)、减少状态切换(共享材质、图集)、减少无效提交(Culling、LOD)以及更高级的 GPU Driven 方案几个方向做。

http://www.jsqmd.com/news/708930/

相关文章:

  • 除了写代码,程序员最该投资的3项“软技能”
  • 5个高效数据提取的最佳实践方案:Web Scraper Chrome扩展深度指南
  • 掌握 FloPy:Python 地下水流建模的完整指南
  • 终极macOS视频预览解决方案:QuickLookVideo让你的Finder支持30+视频格式
  • 多模态控制图像生成:统一框架设计与应用实践
  • 告别算法内卷:留学生如何切入硅谷与欧洲 EdTech (AI Tutor) 的千亿蓝海
  • Windows电脑如何直接安装安卓应用:APK安装器终极使用指南
  • 如何用3步完成Evernote数据自主管理:完整本地备份终极方案
  • Portarium:自托管服务统一入口与反向代理部署实战
  • 终极指南:如何一键扩展Android Auto功能,无需Root手机
  • 企业级AI动态经济模拟架构与融资决策算法解析
  • 【2026唯一认证配置手册】:NVIDIA Container Toolkit v1.15兼容表+CUDA 12.6动态绑定方案,官方未公开的3个隐藏flag
  • 前端工程化最佳实践
  • 2026年4月福建应急发电机采购指南:淘工控硬实力解析与优选推荐 - 2026年企业推荐榜
  • 2026年昆明短视频运营与AI搜索优化:本地企业全网营销获客完全指南 - 企业名录优选推荐
  • C语言实现PLCopen Part 3兼容性开发:从零构建符合IEC 61131-3标准的可移植运行时引擎
  • 10个Illustrator脚本工具:让设计效率提升10倍的秘密武器
  • 数据安全中的加密计算与隐私保护技术
  • 手把手教你用LDRA Testbed配置MISRA-C-2012检查,让代码合规更高效
  • 2小时,我搭了一套采购+库存一体化系统!
  • E7Helper:为《第七史诗》玩家设计的智能自动化助手
  • 四川地区赛事物料租赁服务商选择参考 - 深度智识库
  • Go 模块依赖管理策略
  • Windows 10安卓子系统反向移植:无需Win11的完整Android应用生态解决方案
  • 保姆级避坑指南:在Ubuntu 21.04上搞定USRP X410与Gnuradio 3.9的完整配置流程
  • 别只盯着AlphaFold了!这5个免费蛋白质结构预测服务器,哪个更适合你的课题?
  • 3种高效方法:让你的m3u8视频下载变得如此简单
  • 第三代RAG系统:文本结构与语义检索的协同优化
  • [实战] 样品检验报告自动化:从CAD图纸到FAI/PPAP的数字化进阶指南
  • 3步掌握GEMMA:快速上手全基因组关联分析工具,轻松处理复杂遗传数据