跳到主要内容
腾讯题库 · Q38
先读 30 秒回答

第 38 题 / 50

学习状态 未开始

Draw Call 合并

面试官问

PDF 第 81 页

什么是“Draw Call 合并”?在腾讯项目中,你如何通过材质合并、图集打包减少 Draw Call?(必问题,理清逻辑)

工具与管线 draw-call · batching 对应课程:engine-pipeline

先把问题答上

你可以直接这样回答

约 30 秒

Draw Call 合并是在不破坏材质、排序和阴影语义的前提下共享提交。材质合并/图集减少状态切换,Instancing 复用相同几何;我会同时记录 draw calls、GPU、带宽和画质,避免只报一个下降数字。

这道题真正想听什么?

先确认比较对象和回答边界,再决定要不要展开公式、工程实现或性能取舍。

它考你能不能把“合批”说成约束:相同材质/Shader 状态和合适的几何才能共享一次提交;图集减少纹理状态切换,但可能增加图集尺寸、mip 串色和内存。Instancing 适合大量相同网格,静态 batching 适合不变几何。没有项目证据时只说设计,不说“我在腾讯做过”。

把答案讲到 2 分钟面试必答 · 约 2 分钟 · 补足因果、输入和取舍

先分析批次为什么被拆:材质、纹理、透明、灯光 Pass 还是不同网格。静态物体可考虑 static batching,重复网格用 GPU instancing,贴图用带 padding 的 atlas。改完复测 mip 串色、阴影、剔除和内存;若片元是瓶颈,合批不一定解决。

面试官可能继续追问什么?补充自测 · 约 3 分钟 · 检查自己是不是真的懂了
  • 问:为什么合批后画面可能变差? 答:图集 padding、mip 采样、材质参数被迫统一,都会造成串色或细节损失。
  • 问:Instancing 等于合并所有材质吗? 答:不是。它复用几何/Shader 提交,材质变体、透明排序、阴影 Pass 仍可能拆批。
  • 因果链: 材质/纹理状态 → 批次边界 → 提交数量 → GPU/CPU 成本 → 纹理与画质边界。
如果概念还是悬空,就去做实验关键证据 · 约 5–15 分钟 · 预测 → 单变量 → 观察

实验不是第二份答案,它只负责证明答案

如果上面的解释已经听懂,可以直接跳过。卡住时,再沿着这三步把抽象词变成画面证据。

  1. 先猜 输入经过哪些阶段才变成输出?最可能失败或变慢的那一步在哪里?
  2. 去取证 固定其他条件,只改一个参数。先写下变化,不用“更真实”“更高级”这种空词代替证据。
  3. 再追问为什么 是哪一步造成这个结果?如果结果相反,先检查输入、空间、算法,还是显示输出?
我完全没头绪,给我一个起点

先截下默认状态,只动页面当前开放的那个参数。你只需要说清楚“原来怎样 → 改了什么 → 现在怎样”。

1. 先预测

Engine Pipeline Labscene=runtimedebugMode=batching,先设 batchCount=30atlasCoverage=0.2instanceCount=20;在 Shader Performance Labscene=crowd,比较 useInstancing=true/false。预测:提高 atlasCoverage 或打开 Instancing 可能降低提交,但提高 shaderWork 后 GPU 仍会升。输入 → 变化 → 输出: 状态/实例数据 → 合批策略 → Draw Calls、GPU ms、带宽与画质。

老师追问

先别急着查答案: 先画出输入 → 处理 → 输出的路径:你猜瓶颈在哪一段,准备拿什么日志或 profiler 证明?

为什么: 你刚才的预测依赖哪个前提?如果把“Draw Call 合并”里最关键的变量或约束关掉,画面/输出会先坏在哪里?

如果结果相反: 先排除哪一层,再谈结论?这个规则的边界是什么?

2. 再动手

固定实例数,依次只改 batchCountatlasCoverageinstanceCountuseInstancing;每轮记录 Engine Pipeline 的 draw calls、GPU ms、ATLAS/BATCHED 状态,以及 Shader Performance 的估算 ms 和 fragment work。把 Instancing 代码批次代码 对照,写出“减少提交但没有减少片元”的反例。

3. 最后对证据

Engine Pipeline 的 atlas coverage 增大可能显示 BATCHED、draw calls 降低;Shader Performance 关闭 Instancing 时实例提交成本上升。若同时加大 shaderWork 或透明层,GPU 仍可能超预算。Lab 的数字是教学模型,图集实际收益还要在目标 GPU、mip 和纹理压缩设置下复测。

答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
  • 批次/图集:看 atlas 与 instance savings 如何进入估算。
  • Instancing:看实例数据如何复用一次提交。
  • 调试输出:区分 instance identity 与真正的材质共享。
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级

生产上会把批次规则写进导入/构建报告,保留原始材质、atlas 版本和回滚信息。按场景与设备设置实例数、材质变体和纹理预算;移动端宁可保住高辨识度主体,也不把远景全部塞进超大图集。最终验收包含 draw calls、GPU p95、bandwidth、VRAM、mip 质量和透明排序。

哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
  • 看见 draw calls 下降就宣布性能完成。
  • 忘了图集 padding、颜色空间和 mip 边界。
  • 把 Instancing 当作跨材质、跨透明排序的万能开关。
  • 合批后没有保留可回滚的材质/atlas 版本。