Unity3D 优化深入浅出 4-GPU 篇(公众号笔记)
ABSTRACT
2018-01 公众号笔记,优化系列第四篇(最详实的一篇)。按 GPU 渲染流水线逐段讲解:顶点着色器→裁剪→光栅化→片元着色器→逐片元操作,并给出减顶点、减 overdraw、减实时光照、禁动态阴影、简化 shader 五大优化方向。
核心要点
- GPU 流水线:顶点着色器(坐标变换、逐顶点光照)→ 可选的曲面细分/几何着色器 → 裁剪 → 屏幕映射 → 三角形设置/遍历(光栅化,产生片元)→ 片元着色器(纹理采样、逐像素颜色)→ 逐片元操作(深度/模板测试、混合)。
- 顶点数直接决定流水线工作量:优化几何体(美术侧)、LOD 技术(类似模型的 mipmap,代价是占更多内存)、Occlusion Culling 遮挡剔除。
- 片元着色器是最终颜色计算者,复杂光照下最易拖后腿,优化核心是减少 overdraw(同一像素重复绘制)。
- 移动平台绘制顺序策略:不透明物体从前往后绘制(尽早深度剔除),透明物体从后往前混合;尽量把物体放 Geometry 队列(2000)。
- 渲染队列速查:Background 1000 → Geometry 2000 → AlphaTest 2450 → Transparent 3000 → Overlay 4000,数字越小越先渲染。
- 减少材质数量利于合批;用纹理图集代替零散小贴图;共享材质时用 Renderer.sharedMaterial 而非 material(避免实例化副本)。
- 实时光照是移动平台大敌:逐像素点光源让被照物体重复渲染、drawcall 与 overdraw 翻倍,且打断批处理。替代方案:Lightmap 烘焙、Light Probes、体积光模拟。
- 动态阴影是片元灾难,替代方案:阴影贴图、烘焙 lightmap、投影生成器、ShadowMap。
- shader 简化要点:优先用 Unity 内置 mobile 版 shader;pow/exp/log/trig 等复杂运算用纹理查表代替;除法改乘法;移动端避免 alpha_test(PowerVR 上比 alpha_blend 更耗,与 PC 经验相反);低精度浮点更快;不要加多余 Pass。
关键实体与概念
渲染管线、顶点着色器、片元着色器、光栅化、overdraw、渲染队列、LOD、Occlusion Culling、Lightmap、Light Probes、ShadowMap、alpha_test/alpha_blend
关联概念
来源回溯
- 原始文件:
raw/ip/wechat_articles/Unity3D优化深入浅出4-GPU篇.md(2018-01-11)
时效性评估
- 仍有效:渲染管线各阶段职责、overdraw 原理、渲染队列数值、光照烘焙替代实时光的思路属于图形学基础,长期有效。
- 已过时:基于 Unity 5 内置渲染管线(Built-in RP);URP/HDRP 下 shader 写法、光照系统(混合光、APV 探针体积)已更新;现代移动 GPU 对 alpha_test 的惩罚因厂商而异,不再绝对。DOTS/ECS 时代的批处理逻辑由 SRP Batcher 接管,但「减材质、减状态切换」的方向不变。