Unity性能优化系列设置篇 - URP 移动端设置基线与分档策略

Unity性能优化系列设置篇 - URP 移动端设置基线与分档策略 性能优化系列 · 设置篇。一句话摘要移动端不要一套 URP 配置跑到底先按高中低设备分档再决定 HDR、阴影、后处理这些开关在哪些档位保留。每个设置先看官方三档再弄清它做什么、性能消耗在哪里、关掉画面会不会差项目没用到、或者中低端吃紧就按档位牺牲掉。移动端做 URP 设置第一件事不是问「这个开关到底该不该开」而是先问「它该在哪一档设备上开」。高端机可以保留更多画面层次中端机保留最容易被玩家感知的效果低端机优先守住帧率、温度和内存。比如 HDR如果项目强依赖 Bloom、Tonemapping高端机可以开中端机要看真机带宽和后处理耗时低端机如果没有明显画面收益直接关掉通常更稳。这也是后面所有建议的前提不是把画质开关简单分成开和关而是把它们接到设备档位上。同一个开关在高端机上可能是画面收益在低端机上可能就是发热、掉帧和全屏带宽。以默认 URP 工程为例这篇对着 Unity 2022.3 自带的 URP 模板讲。模板里有三档 Pipeline AssetQuality 里各绑一份URP-Performant→PerformantURP-Balanced→BalancedURP-HighFidelity→High Fidelity设置散在三处官方也是三处一起切URP Asset阴影、附加光、HDR、MSAA、Render Scale、全屏纹理Renderer AssetRenderer Feature、后处理数据Quality SettingslodBias、蒙皮权重、各向异性以及这一档用哪份 Pipeline Asset这套配置不是「只给手机」或「只给 PC」。Quality 里的平台默认档把意图写死了Android / iPhone / tvOS / WebGL 默认BalancedStandalone 和主机默认High FidelityServer 才是 Performant。这篇文章以官方 URP 的三个档位作为参考坐标。移动端不要直接照搬官方的 High Fidelity也不要一上来就压到 Performant更合理的做法是先理解官方 Performant / Balanced / High Fidelity 的差异再以官方 Balanced 作为移动端基础配置在这个基础上拆出移动端高 / 中 / 低三档。移动端高档可以保留更多接近 Balanced 的效果移动端中档以 Balanced 为基线逐项 A/B移动端低档则向 Performant 收把项目没用到、或者成本明显高于收益的项关掉。High Fidelity 上的 4096 阴影、4 级级联、MSAA 4x、每对象 8 盏附加光主要面向 PC / 主机不应该直接搬到手机上。后面每一项都按同一套格式讲官方三档、它是干什么的、性能消耗和画面差、建议。性能消耗是低 / 中 / 高画面差是轻微 / 中等 / 明显。口径来自 URP 手册标的「性能影响」、Unity 对效果本身的定义以及移动端常见压测经验。HDRPerformantBalancedHigh Fidelity关开开HDR 是让颜色缓冲能记下更亮和更暗的值而不是把高光直接裁成纯白。开了以后Bloom、Tonemapping、基于物理的光照才有足够的亮度范围可算关掉时颜色写在普通 LDR 缓冲里带宽更省但亮部更容易过曝、Bloom 也更容易脏。性能消耗画面差中中等消耗性能的地方在于更大的颜色 RT以及后续依赖 HDR 的全屏后处理。没有 Bloom、也看不出色带关了几乎没人察觉。模板 Graphics 里Lights Use Linear Intensity默认是开的和 HDR 配套只开 HDR、线性强度却关着画面会「亮了但也不对」。建议项目没有 Bloom、Tonemapping或者中低端带宽已经吃紧可以关。反过来如果决定开启 HDR就不要只孤立地勾 HDR颜色空间建议使用 LinearLights Use Linear Intensity也要保持开启Bloom、Tonemapping 这类依赖高动态范围的后处理再按画面需求和设备档位一起评估。少开其中一环常见结果是性能成本付了亮度和高光却不稳定。MSAAPerformantBalancedHigh Fidelity关关4xMSAA 是多重采样抗锯齿在三角边缘多采几个点把锯齿抹平。它管的是几何边缘不是贴图模糊对 UI 图、文字几乎没帮助。性能消耗画面差高中等Unity 手册写明 MSAA 会用带宽在 framebuffer 上来回拷。手机 GPU 是 tile-based倍数直接打在每个像素上。URP Asset 和 Quality 里的 Anti Aliasing 会一起生效两处都开等于叠了一次。画面上只有 3D 模型边缘会锯纯 UI、卡片、偏平的场景开不开差不多。建议如果模型几何边缘锯齿明显并且目标设备仍有足够的带宽和帧时间余量最多尝试 2x并和 Render Scale 一起评估。先降低 Render Scale 再开启 MSAA往往会让画面更糊收益不一定成立。中低端设备不建议开启更不要直接套用 4x。主光阴影PerformantBalancedHigh Fidelity关开1024开4096主光阴影是平行光太阳光打出来的实时阴影先把场景从灯光方向画进一张 shadowmap再在物体上采样决定这块是不是在影子里。没有它角色和建筑不会在地上投下随时间动的影子有它远近层次会清楚很多。性能消耗画面差高明显多一张 shadowmap、多一个阴影 Pass手机还要付采样带宽。分辨率从 1024 拉到 4096图是 16 倍面积。没有角色在地上走、没有会动的接触阴影关了几乎看不出有角色、有建筑落影一关就扁。建议如果场景里没有需要随物体移动的实时阴影或者中低端设备的 Shadows、SetPass、带宽已经吃紧可以关闭主光实时阴影改用烘焙阴影或贴片阴影。不要为了「更清晰」直接把阴影分辨率拉到 4096。附加光PerformantBalancedHigh FidelityDisabledPer Pixel每对象 2Per Pixel每对象 8附加光是主光之外的点光、聚光。Disabled 完全不算Per Vertex 在顶点上算便宜但大面体会有色块Per Pixel 在每个像素上算体积光、近处灯更准CPU 要按物体循环灯光片元也更贵。每对象上限决定同一个物体最多吃几盏。性能消耗画面差中高中等Per Pixel 是 CPU GPU 两边账单。场景里根本没有点光 / 聚光这项等于白开循环只有主光的大厅、卡牌桌关了没画面差。建议如果场景里没有点光 / 聚光或者中低端设备的渲染提交已经吃紧可以降到 Per Vertex 或 Disabled。不要直接套用每对象 8 盏的上限先确认同一个物体实际最多会受到几盏灯影响。附加光阴影PerformantBalancedHigh Fidelity关关开4096附加光阴影让点光、聚光也能投影子例如手电筒打在墙上的光斑边缘。每开一盏就要再出一份阴影图。性能消耗画面差高中等Unity 自己的性能建议也是用得着附加光时先降 atlas能关阴影就关。没有手电筒、局部灯打墙开了也看不见。建议角色脚下的局部阴影、手电筒一类效果优先考虑 Blob Shadow 或贴片方案。不要只为了一盏附加光就启用 High Fidelity 那套附加光阴影。阴影距离PerformantBalancedHigh Fidelity5050150阴影距离是实时阴影从摄像机出发能盖多远。超出这段的物体不再进 shadowmap远处就没有实时影子。距离越大同一张图要覆盖的世界越大近处影子越糊除非再加级联或提高分辨率。性能消耗画面差中中等距离拉长阴影 Pass 里的物体变多。摄像机永远对着近处桌面50 米以外的影子本来就没有观众。建议如果摄像机视距很近、远处阴影没有实际观感收益或者中低端设备上的 shadowmap 已经变糊且带宽压力明显可以进一步缩短阴影距离。移动端不要直接拉到 150。阴影级联PerformantBalancedHigh Fidelity114级联是把阴影距离切成几段近处一张高精度 shadowmap远处一张低精度。1 级就是整段共用一张图4 级是近处很细、远处四份图轮着画。级联越多近处影子越利Pass 和带宽也越多。性能消耗画面差高4 级中等Unity 手册写明增加 cascade 会减性能。近处没有角色脚底影子1 级和 4 级看不出差别。建议不要上 4 级联。软阴影PerformantBalancedHigh Fidelity关开开软阴影是在已经有实时阴影之后对影子边缘做滤波让边缘不那么硬。它不产生影子只改影子的样子。性能消耗画面差高中等URP 手册把这项标成性能影响高。关掉就回退成硬件滤一次。主光阴影都关了这项零画面、只留变体。建议如果主光阴影已经关闭软阴影也应该一起关闭如果中低端设备上软阴影滤波的收益不足也可以关闭。Render ScalePerformantBalancedHigh Fidelity111Render Scale 是 3D 场景相对屏幕的渲染分辨率。1 是按屏幕像素画0.8 是先画小一点再拉伸。它只管填充不管阴影 Pass、附加光循环这些 CPU 侧提交。UI 仍按设备分辨率画。性能消耗画面差高填充一关就明显3D 会糊下调对 GPU fill 很有效3D 会立刻软一档UI 不受影响。不要当唯一手段降了分辨率阴影和附加光该贵还是贵。建议如果中低端设备的 GPU 填充压力已经很高并且项目能接受 3D 画面略微变糊可以下调 Render Scale。Depth TexturePerformantBalancedHigh Fidelity关关关Depth Texture 是把相机深度再拷一份出来给软粒子、折射、SSAO、某些后处理采样「这一点离相机多远」。开了就是一张常驻全屏图加一次拷贝。性能消耗画面差中几乎看不出没人采样则无差Unity 的性能清单把「用不到就关 Depth Texture」写在最前面。没有软粒子、SSAO、深度特效开着是纯带宽。建议没有明确使用者就关。效果砍了开关一起关。Opaque TexturePerformantBalancedHigh Fidelity关关关Opaque Texture 是不透明物体画完后的场景颜色拷贝给折射、一些扭曲特效去采样「后面是什么」。同样是全屏拷贝 常驻显存。性能消耗画面差中几乎看不出没折射 / 扭曲则无差和 Depth Texture 同类没人读就关。建议如果没有折射或扭曲效果依赖 Opaque Texture就保持关闭一旦开启必须明确具体由哪个效果使用。反射探针混合和盒投影PerformantBalancedHigh Fidelity关关开反射探针存的是环境反射。混合让物体在两枚探针之间过渡时不要突然换环境盒投影让室内反射按房间形状贴而不是按一个圆球贴。画面上是镜子、地面、金属的环境更稳采样和计算更贵。性能消耗画面差中中等Unity 对低端移动的建议就是关掉这两项。没有反射探针、没有大块金属和室内镜面开了等于空转。建议只有在场景确实使用反射探针并且探针过渡或室内反射问题明显时才考虑开启开启前要确认目标设备仍有足够的性能余量。SSAOPerformantBalancedHigh Fidelity无有降采样有更高精度SSAO 是屏幕空间环境光遮蔽用深度有时加法线估像素周围挡没挡住光把缝、洞、交叉、贴在一起的表面压暗。墙角、洞窟、箱子贴地、角色衣服夹缝会多一层脏暗体积感出来。它是 Renderer Feature和 Bloom 那种 Volume 后处理不是一回事通常还要深度图。性能消耗画面差高轻微消耗性能的地方在于全屏多 Pass。URP 这份实现里采样半径、采样数官方标的性能影响是 High模糊质量和降采样是 Very high降采样是用分辨率换性能。知乎上拆过 URP SSAO算完要走采样再走几次模糊低端机上就是典型填满。画面差完全取决于几何。官方说明也是 crease、hole、intersection、靠近的表面。没有洞窟、没有深墙角、没有物体贴地贴墙开不开几乎没影响——大厅、卡牌桌、偏平的 UI 场景最容易白开。强度拉高还会在角色脸上、平面上脏一圈观感不一定更好。建议如果场景里的墙角、接触面用不上这层暗部细节或者中低端设备的 fill、深度图成本已经吃紧可以移除 SSAO。要保留 SSAO就要把深度图成本一起算进去并且只给真正有缝隙、孔洞和交叉面的场景开启。后处理PerformantBalancedHigh Fidelity挂后处理数据挂后处理数据挂后处理数据后处理是画完场景之后整屏再滤一层Bloom 把亮部散出发光Tonemapping 把 HDR 压回能显示的范围Vignette 压四角DOF、Motion Blur 再单独算。Renderer 上要挂后处理数据场景里还要有 Volume 打开对应效果两边缺一不可。模板场景的 Volume 里有 Bloom、Vignette、Tonemapping。性能消耗画面差中高中等每一项都是全屏 Pass。Bloom 在有 autolight、爆炸、金属高光时一眼能看出没有过亮像素开着也只是略雾。DOF、Motion Blur 更贵电影镜头才用得上玩法视角一关几乎没人记得住。建议如果项目没有使用 Bloom / Tonemapping或者中低端设备的全屏 Pass 已经吃紧后处理数据可以不挂载对应的 Volume 效果也不会执行。DOF、Motion Blur 即便挂了后处理数据也不建议在移动端默认开启。SRP BatcherPerformantBalancedHigh Fidelity开开开SRP Batcher 是 URP 的默认提交路径同一套 shader 变体下多次绘制少做一次渲染状态整理Draw 次数不一定少但每次更便宜。它不合并网格也不替代 Instancing。性能消耗画面差无是性能优化项无这是提交路径不是画质开关。材质不兼容时开了也没用。建议保持开启。如果材质不兼容或者 shader 变体过于分散即使开关开启Frame Debugger 里也看不到SRP Batch这时应先治理材质和变体细节放到渲染篇讨论。动态合批PerformantBalancedHigh Fidelity关关关动态合批是每帧把合格的小网格在 CPU 上变换、拼成一批再提交用来减少很小、会动的物体的 Draw。限制很死拼 mesh 本身也吃 CPU。性能消耗画面差视 CPU无官方三档都关。Batches 降了但 CPU 更忙就是负优化。建议默认关闭。如果要开启必须用真机 A/B 验证只看到 Batches 下降还不够如果 CPU 侧更忙就应该关闭。lodBiasPerformantBalancedHigh Fidelity0.412lodBias在 Quality 面板不在 URP Asset 里。它乘在 LOD 切换距离上数字越大越晚切到低模近处更精细同屏面数更高。性能消耗画面差中面数中等没有 LOD 组改这个没效果。远景物件较多时数值过大会明显增加顶点处理压力。建议如果中低端设备的面数压力已经很高可以降到 0.4。不要为了远景精细度直接使用 2除非远景物件很多并且目标设备仍有足够的顶点处理余量。档位越高才应该越晚切到低模。蒙皮权重PerformantBalancedHigh Fidelity24255蒙皮权重是蒙皮网格上每个顶点最多跟几根骨骼。2 根够大多数角色4 根关节更圆255 基本是「全开」给 PC 看的。性能消耗画面差低中中等没有蒙皮角色无差。关节多的手指、衣摆2 和 4 能看出圆不圆。建议如果角色没有复杂关节或者中低端设备的蒙皮成本已经吃紧可以降到 2。移动端不要使用 255。各向异性PerformantBalancedHigh Fidelity关Per TextureFull各向异性过滤是贴图被斜着看时减少地面、墙壁那种一拉就糊的感觉。关着最便宜Per Texture 只对开了各向异性的贴图生效Full 全开最贵。性能消耗画面差低中中等摄像机几乎平视 UI、没有大块地面关了看不出。建议如果镜头里几乎不会斜看地面和墙壁或者中低端设备已经吃紧可以关闭各向异性过滤。移动端不要使用 Full。垂直同步PerformantBalancedHigh Fidelity关开开垂直同步让出帧对齐屏幕刷新能减撕裂也可能把帧率锁在刷新率上并在等刷新时把 CPU 堵住。它不管画得好不好管的是出帧节奏。性能消耗画面差中等刷新无手机更适合用targetFrameRate。建议如果垂直同步导致 CPU 等待刷新中低端设备上的影响会更明显可以在 Quality 里关闭。Quality 里还有pixelLightCount、shadows、shadowCascades这些 Built-in 遗留项。URP 下以 Pipeline Asset 为准改 Quality 的 Shadow Distance不会改 URP Asset 里的 50。切档接到工程里官方是 Quality 每一档指向一份 Pipeline Asset。Graphics 默认管线指向 High FidelityAndroid / iOS 的平台默认档是 Balanced。运行时按设备能力切一次即可function applyGraphicsTier(): tier deviceTier.evaluate() asset pipelineAssets.forTier(tier) // Performant / Balanced / High Fidelity qualitySettings.renderPipeline asset log(graphics tier applied, tier)切换放在加载阶段之前进场景后再切会画质跳变阴影和光照还会在中途重新初始化Quality 档位、平台默认档、运行时切档入口必须指向同一套 Asset一对一。两处引用不一致档位变了管线没变关了主光阴影软阴影、附加光阴影一起关和官方 Performant 一致设备怎么评级是后面设备分级篇的事这里只消费结果。怎么查看Unity ProfilerCPU / GPU Frame Time、Main Thread / Render Thread每个开关改动前后各采一组。连线真机本身有开销趋势可用绝对值慎用Frame Debugger确认关掉的阴影、拷贝、后处理、SSAO 对应的 Pass真的消失了。「参数关了但 Pass 还在」只有这里能直接证实真机 Release 包Editor 只能快速迭代结论以真机 Release 为准。快速回归用 SoloPi 看帧率 / CPU / 温度长期用 UPR 分机型沉淀每次只改一个开关记 CPU / GPU / 内存。批量改无法归因建议怎么落地不要把这篇当成「每个项目都照抄的参数表」。更稳的做法是把它变成一张项目内的 URP 设置评审表每个开关只回答四个问题这个效果在当前项目里有没有真实使用场景关掉以后目标场景里的画面差是轻微、中等还是明显它主要消耗 CPU 提交、GPU fill、带宽、显存还是 shader 变体它应该保留在哪些设备档位高端、中端、低端是否一致落地顺序建议这样走先以官方 Balanced 作为手机基线不直接套 High Fidelity也不要一上来压到 Performant把低端机最贵的项先收掉实时阴影、SSAO、后处理、HDR、全屏纹理、MSAA对画面差明显的项比如主光阴影不要只做开关选择要准备替代方案烘焙、Blob Shadow、贴片阴影、低距离实时阴影对画面差轻微的项比如很多偏平场景里的 SSAO优先从低端和中端移除把预算留给更容易被玩家看到的效果每改一项都用 Frame Debugger 确认 Pass 真的少了再用真机 Release 看帧时间、温度和内存不要只看 Editor 画面感觉。最后把这些结论固化到三份 Pipeline Asset 和 Quality 档位里而不是靠口头约定。新增效果时也按同一张表过一遍先说明收益再说明成本最后说明哪些设备档位能开。容易犯的错误把 High Fidelity 当手机默认官方把 Android / iOS 的默认档设成 BalancedStandalone 才是 High FidelityQuality 和 Pipeline Asset 对不上官方是一档一份。两处引用不一致切档会没效果关了主光阴影软阴影还开着官方 Performant 是一起关的。留下去没有画面只会干扰变体Opaque/Depth Texture开了没人用效果砍了开关还在低配机白扛全屏拷贝。开启前必须明确具体使用者SSAO 当必开项官方 Balanced 就挂了。没有缝、洞、贴合面开不开几乎看不出中低端 fill 却先满只改 Quality 里的 Shadow Distance / CascadesURP 不吃这几个 Built-in 项要改 URP Asset总结移动端 URP 设置的核心不是追最高画质而是把画质成本按设备档位分配清楚。手机默认从 Balanced 起步高端机可以保留更多效果中低端要主动收掉不稳定、收益低或成本高的项。每个开关都要同时看「性能消耗」和「画面差」。主光阴影关掉会直接少投影属于明显画面变化SSAO 只在缝隙、孔洞、交叉面丰富时才容易体现很多偏平场景里差异很轻。不能只按开关名字判断重要性。低端机优先砍全屏和实时项。HDR、SSAO、后处理、MSAA、Depth/Opaque Texture、实时阴影都会直接打到带宽、fill 或额外 Pass项目没用到或者玩家看不出就不要让低端机长期背这个成本。画面差明显的项要准备替代方案而不是粗暴关闭。阴影可以用烘焙、Blob Shadow、贴片或短距离实时阴影兜底后处理可以只保留最关键的一项HDR 可以只给确实依赖 Bloom/Tonemapping 的档位。所有结论都要落到可验证的 Asset 和流程里。三档 Pipeline Asset、Quality 默认档、运行时切档入口要一一对应改完用 Frame Debugger 确认 Pass 消失用真机 Release 看帧时间、温度和内存Editor 只负责快速迭代。创作不易。如果这篇文章对你有所帮助欢迎关注、点赞、收藏我会持续输出游戏开发相关内容关注不迷路。ღ( ´ᴗ )比心。