学习目标
你要能够解释什么
能把 shader 优化问题拆成算术、访存、分支、带宽和分辨率五类。
Interview evidence
题库练习
把这一节课的画面证据,接回 PDF 里的原题。先做一个小预测,再去题目页整理成自己的回答。
-
粒子 Shader 优化
先自己猜:这道题在考什么?
参考答案:我先区分 CPU Draw Call、透明 overdraw、纹理带宽和片元复杂度,再按证据优化:Instancing/合批、材质与图集、减少粒子覆盖、减少采样和分支、按距离降低质量或更新频率,必要时改 GPU simulation。每项都要用 draw calls、overdraw 和 GPU ms 验证。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
视距 LOD 材质切换
先自己猜:这道题在考什么?
参考答案:视距 LOD 先按距离或屏幕占比选材质档,模型 LOD 同时换网格;二者都要考虑材质变体、阴影、动画和提交。阈值要有滞回/交叉淡化,验收同时看 GPU、顶点、draw calls 和 popping,不是只看 FPS。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
GPU Instancing 植被
先自己猜:这道题在考什么?
参考答案:GPU Instancing 复用植被 geometry/材质,在少量提交中传入每实例矩阵、颜色和风摆参数,主要降低 CPU draw calls。材质差异要尽量变成实例属性、图集或索引;无法表达的差异分组拆批。验收同时看 draw calls、实例带宽、显存和 GPU。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
Shader 溢出调试
先自己猜:这道题在考什么?
参考答案:- 先让错误可见:在真实 shader 中我会把最终颜色换成中间值 debug,检查 NaN/Inf、除零、radiance 范围、精度和 target 格式。 - 再固定证据:用 GPU frame capture 或固定失败预设复现;当前 Lab 只有 HDR cost、precision budget 和 cost-debug 文本。 - 最后守住修复边界:Clamp 只在明确输出边界止血,不能替代上游根因修复;我会同时保留原始值和处理后值。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
GPU Profiler
先自己猜:这道题在考什么?
参考答案:我会先固定镜头、分辨率和目标设备,用 Unity Profiler/Frame Debugger 区分 CPU、GPU、Draw Calls、Overdraw 和带宽,再做单变量实验。优化后复测 p95/p99、画质和温度;没有真实数据时我会明确说是验证方案,不冒充项目结果。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
Overdraw 与 Depth Pre-Pass
先自己猜:这道题在考什么?
参考答案:Overdraw 是同一像素的重复片元工作。Depth Pre-Pass 先写深度,可能让 Early-Z 拒绝遮挡片元,但新增 Pass 也要付成本;我会在固定镜头下对比 overdraw、GPU、带宽和透明正确性,再决定是否启用。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
GPU Timeline
先自己猜:这道题在考什么?
参考答案:我会先用 GPU Timeline 找到粒子帧中真正占时的阶段,再按证据减少透明覆盖、Shader 采样、粒子数量/更新频率或提交。Instancing 只能解决一部分提交成本;优化后要用真实设备验证 GPU、CPU、带宽、温度和画质。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
实验循环
按顺序做一次实验
-
Step 1
建立基准帧
- 改什么
- Pass = baseline
- 怎么做
- 记录同一分辨率下的 GPU 时间与 draw call。
- 你会看到
- 基准让之后的每次开关都有可比较的差值。
- 它代表
- 优化首先是测量协议,随后才是代码动作。
Code anchor · performance report · baseline
-
Step 2
打开高成本分支
- 改什么
- Normal / noise / parallax
- 怎么做
- 一次只打开一个效果。
- 你会看到
- 时间变化可能来自纹理带宽,也可能来自循环和分支。
- 它代表
- 单变量实验能区分“算得多”和“读得多”。
Code anchor · shader-performance.frag.glsl · feature gates
-
Step 3
降低分辨率与精度
- 改什么
- Scale 1 → 0.5 · precision
- 怎么做
- 保持效果开关不变,降低目标分辨率或精度。
- 你会看到
- 成本下降但边缘、噪声和稳定性开始变化。
- 它代表
- 移动端优化是在视觉误差与预算之间选一个可交付点。
Code anchor · performance report · budget
快速复习
用三分钟找回因果链
这里没有第二套答案。以下内容直接来自上面的课程事实,方便你在面试前快速检索。
一句话核心
用可控开关测量一条 fragment 路径的成本,而不是凭“代码看起来复杂”下结论。
- 优化首先是测量协议,随后才是代码动作。
画面证据:基准让之后的每次开关都有可比较的差值。
- 单变量实验能区分“算得多”和“读得多”。
画面证据:时间变化可能来自纹理带宽,也可能来自循环和分支。
- 移动端优化是在视觉误差与预算之间选一个可交付点。
画面证据:成本下降但边缘、噪声和稳定性开始变化。
代码定位
- performance report · baseline
- shader-performance.frag.glsl · feature gates
- performance report · budget