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

第 13 题 / 50

学习状态 未开始

粒子 Shader 优化

面试官问

PDF 第 30 页

你如何优化一个包含 100+ Draw Call 的粒子特效 Shader?请列出至少 5 种优化策略。(必问题,理清逻辑)

Shader particles · performance 对应课程:shader-performance

先把问题答上

你可以直接这样回答

约 30 秒

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

这道题真正想听什么?

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

它不是让你背五个开关,而是先找瓶颈:CPU 提交多,还是透明片元 overdraw 多,还是纹理/分支/更新带宽多。粒子常是半透明卡片,同一屏幕像素会被重复计算;减少 Draw Call 不能自动解决 GPU fragment 成本。

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

100+ Draw Call 不代表瓶颈一定在提交。先固定镜头和数量做 profiler 基线;若 CPU 高,合并材质/Instancing;若 GPU 高,先减透明层、屏幕占比、软粒子和 texture reads;若带宽高,改图集/压缩/更新策略。优化后重新看画质证据,不能只看平均 FPS。

面试官可能继续追问什么?补充自测 · 约 3 分钟 · 检查自己是不是真的懂了
  • 问:至少五种优化策略是什么? 答:按证据可列:批量/Instancing 减提交;合并材质/纹理图集减少变体;降低透明 overdraw(裁剪、粒子数量、屏幕占比);减少纹理读取/分支;远处降低分辨率或更新频率;必要时 GPU simulation。每项都要有画质边界。
  • 问:为什么 Draw Call 低了还会慢? 答:片元重叠、软粒子深度读取和复杂噪声仍会让 GPU 忙;先看现有 FPS、GPU ms、Overdraw、Bandwidth、VRAM、frame-budgetcost-debug,逐像素 heatmap/时间线要用真实 GPU capture 另行复核。
  • 因果链: 粒子生成/更新 → 提交/实例数据 → 覆盖像素与片元工作 → 纹理带宽 → GPU ms/FPS。
如果概念还是悬空,就去做实验关键证据 · 约 5–15 分钟 · 预测 → 单变量 → 观察

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

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

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

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

1. 先预测

Particle Shader Cost Lab 先固定 particleCount=280overdrawLayers=4shaderWork=24textureReads=2。预测把 particleCount 翻倍会同时推高 overdraw 与 GPU ms;关闭 useInstancing 会主要推高 draw calls/CPU。把每个粒子想成透明贴纸:贴纸数量和同一像素叠几张是两笔不同账。

成本的口语估算:

frame cost ≈ vertex work + covered pixels × overdraw × fragment work

意思是“顶点要搬多少 + 屏幕上每个像素被透明片重复算多少 × 每次片元有多复杂”。它不是设备实测公式,但能帮助你决定先量哪一栏。

老师追问

先别急着查答案: 先追一条数据从输入到像素:它经过哪一步计算,哪一个中间通道会先暴露问题?

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

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

2. 再动手

粒子 overdraw 代码 先只改 particleCount,再只改 overdrawLayerstextureReadssoftParticlesuseInstancing。每轮记录 FPS、GPU ms、Draw Calls、Overdraw、Bandwidth、VRAM、frame-budgetcost-debug;逐像素热力图与时间线需真实 GPU capture 外部复核。最后把至少五种策略按“它减少哪一项成本”写成表格,而不是只写“优化 shader”。

3. 最后对证据

增大 overdrawLayers 时,PerformanceRenderer 的 Overdraw/GPU ms 和 frame-budget 估算往往上升;关闭 instancing 时 Draw Calls 上升,但画面可能几乎不变;打开 soft particles 会增加估算的 GPU/Bandwidth 成本。该 Lab 只画通用 bars 与 cost-debug,不提供逐像素热力或时间线,后两者仍需目标设备 profiler/capture 验证。

答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级

项目会按近景/远景和设备档位做粒子质量表:数量、透明层、采样、更新频率、分辨率和阴影分别设上限。保留最能传达节奏和轮廓的粒子,其余用低成本 billboard/预烘焙序列;避免把所有粒子都改成同一个糊图。记录峰值 GPU、overdraw、带宽、显存和加载尖峰,移动端用真实机复测。

哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
  • 把 100+ Draw Call 当成唯一问题,忽略透明 overdraw。
  • 只关闭 Instancing,却让每个粒子继续做高采样片元工作。
  • 用降低分辨率掩盖材质/排序错误,画面轮廓已经不可读。
  • 只报告平均 FPS,没有固定场景、峰值和目标设备证据。