跳到主要内容
shader-performance · 课程
从引导学习开始

建议顺序 06 · Shader 与材质

Shader Performance:先找到真正贵的那一项

ALU、纹理、分支、过绘与精度要用同一张预算表比较。

用可控开关测量一条 fragment 路径的成本,而不是凭“代码看起来复杂”下结论。

未完成

这一课的入口

按你现在的状态开始

内容只有一份。入口只改变阅读顺序,不会把技术结论拆成“简单版”和“专家版”。

直接看代码

性能优化 · 固定场景和指标,一次只改一个变量,再讨论预算与画质代价。

  • 定场景
  • 选指标
  • 改一项
  • 看差值
  • 讲取舍

引导学习 · 性能优化

固定场景和指标,一次只改一个变量,再讨论预算与画质代价。

  1. 01 定场景
  2. 02 选指标
  3. 03 改一项
  4. 04 看差值
  5. 05 讲取舍

学习目标

你要能够解释什么

能把 shader 优化问题拆成算术、访存、分支、带宽和分辨率五类。

Interview evidence

题库练习

把这一节课的画面证据,接回 PDF 里的原题。先做一个小预测,再去题目页整理成自己的回答。

  • Q13 shader

    粒子 Shader 优化

    先自己猜:这道题在考什么?

    参考答案:我先区分 CPU Draw Call、透明 overdraw、纹理带宽和片元复杂度,再按证据优化:Instancing/合批、材质与图集、减少粒子覆盖、减少采样和分支、按距离降低质量或更新频率,必要时改 GPU simulation。每项都要用 draw calls、overdraw 和 GPU ms 验证。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q14 shader

    视距 LOD 材质切换

    先自己猜:这道题在考什么?

    参考答案:视距 LOD 先按距离或屏幕占比选材质档,模型 LOD 同时换网格;二者都要考虑材质变体、阴影、动画和提交。阈值要有滞回/交叉淡化,验收同时看 GPU、顶点、draw calls 和 popping,不是只看 FPS。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q17 shader

    GPU Instancing 植被

    先自己猜:这道题在考什么?

    参考答案:GPU Instancing 复用植被 geometry/材质,在少量提交中传入每实例矩阵、颜色和风摆参数,主要降低 CPU draw calls。材质差异要尽量变成实例属性、图集或索引;无法表达的差异分组拆批。验收同时看 draw calls、实例带宽、显存和 GPU。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q18 shader

    Shader 溢出调试

    先自己猜:这道题在考什么?

    参考答案:- 先让错误可见:在真实 shader 中我会把最终颜色换成中间值 debug,检查 NaN/Inf、除零、radiance 范围、精度和 target 格式。 - 再固定证据:用 GPU frame capture 或固定失败预设复现;当前 Lab 只有 HDR cost、precision budget 和 cost-debug 文本。 - 最后守住修复边界:Clamp 只在明确输出边界止血,不能替代上游根因修复;我会同时保留原始值和处理后值。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q37 pipeline

    GPU Profiler

    先自己猜:这道题在考什么?

    参考答案:我会先固定镜头、分辨率和目标设备,用 Unity Profiler/Frame Debugger 区分 CPU、GPU、Draw Calls、Overdraw 和带宽,再做单变量实验。优化后复测 p95/p99、画质和温度;没有真实数据时我会明确说是验证方案,不冒充项目结果。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q42 shader

    Overdraw 与 Depth Pre-Pass

    先自己猜:这道题在考什么?

    参考答案:Overdraw 是同一像素的重复片元工作。Depth Pre-Pass 先写深度,可能让 Early-Z 拒绝遮挡片元,但新增 Pass 也要付成本;我会在固定镜头下对比 overdraw、GPU、带宽和透明正确性,再决定是否启用。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q44 pipeline

    GPU Timeline

    先自己猜:这道题在考什么?

    参考答案:我会先用 GPU Timeline 找到粒子帧中真正占时的阶段,再按证据减少透明覆盖、Shader 采样、粒子数量/更新频率或提交。Instancing 只能解决一部分提交成本;优化后要用真实设备验证 GPU、CPU、带宽、温度和画质。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

实验循环

按顺序做一次实验

  1. Step 1

    建立基准帧

    改什么
    Pass = baseline
    怎么做
    记录同一分辨率下的 GPU 时间与 draw call。
    你会看到
    基准让之后的每次开关都有可比较的差值。
    它代表
    优化首先是测量协议,随后才是代码动作。

    Code anchor · performance report · baseline

  2. Step 2

    打开高成本分支

    改什么
    Normal / noise / parallax
    怎么做
    一次只打开一个效果。
    你会看到
    时间变化可能来自纹理带宽,也可能来自循环和分支。
    它代表
    单变量实验能区分“算得多”和“读得多”。

    Code anchor · shader-performance.frag.glsl · feature gates

  3. Step 3

    降低分辨率与精度

    改什么
    Scale 1 → 0.5 · precision
    怎么做
    保持效果开关不变,降低目标分辨率或精度。
    你会看到
    成本下降但边缘、噪声和稳定性开始变化。
    它代表
    移动端优化是在视觉误差与预算之间选一个可交付点。

    Code anchor · performance report · budget

快速复习

用三分钟找回因果链

这里没有第二套答案。以下内容直接来自上面的课程事实,方便你在面试前快速检索。

一句话核心

用可控开关测量一条 fragment 路径的成本,而不是凭“代码看起来复杂”下结论。

  1. 优化首先是测量协议,随后才是代码动作。

    画面证据:基准让之后的每次开关都有可比较的差值。

  2. 单变量实验能区分“算得多”和“读得多”。

    画面证据:时间变化可能来自纹理带宽,也可能来自循环和分支。

  3. 移动端优化是在视觉误差与预算之间选一个可交付点。

    画面证据:成本下降但边缘、噪声和稳定性开始变化。

代码定位

  • performance report · baseline
  • shader-performance.frag.glsl · feature gates
  • performance report · budget
打开代码页