86.性能优化-GPU-粒子系统优化-GPU侧优化思路
86.1 知识点
粒子系统 GPU 侧优化思路
GPU 侧的目标是少算像素:降低屏幕上参与计算的像素数,以及每个像素计算的内容。
控制 OverDraw
粒子多为半透明,为做透明度混合往往不写深度,导致多粒子叠加时同一像素被多次计算,需要尽量减轻这类 OverDraw:
- 减少粒子数量和粒子尺寸:覆盖面积大致由「粒子数量 × 粒子尺寸」决定。
- 使用 Trim Alpha(修剪透明度):裁掉贴图边缘的无效透明区域。可在美术导出前处理,或用图集工具自动忽略透明边。例如 512×512 的图若有效内容只有 128×128,可把四周透明区裁掉。
- 设置合理的 Start Size(开始大小):避免过大造成满屏覆盖。
- 使用 LOD:远处用雾面贴图或后处理体积雾等替代高精度粒子。
降低几何复杂度
粒子同样要经过顶点阶段,降低几何复杂度可以减轻顶点处理开销:
- 使用广告牌粒子:广告牌一般一个四边形即可。
- 合理使用拖尾模块(Trails):拖尾会把一个粒子拉成很多顶点,增加顶点阶段压力。可调大采样间距、限制最大顶点数。
- 合理使用网格粒子:若用网格粒子,尽量用低面数模型,单个网格粒子就可能上百顶点,会明显增加顶点负担。
减少片元着色开销
从渲染层面降低着色器计算量,即可降低粒子开销:
- 降低着色器复杂度:减少纹理采样,尽量单张贴图,少用法线、遮罩等;避免片元中的分支和高开销函数;粒子一般不必投射阴影,光照也需谨慎。
- 优化贴图:可减少序列帧数量、降低分辨率;压缩贴图,移动端优先使用 ASTC、ETC2 等格式。
替代手段
在满足表现的前提下,用低成本方案替代高消耗表现:
- 能用不透明就不用半透明:如弹壳、碎屑等可用几何队列的不透明粒子,避免半透明排序和混合。
- 用后处理替代:大范围雾、火焰等可用屏幕后处理实现。
- 使用 VFX Graph(Unity 2018.3 起提供的基于节点的 GPU 粒子系统):依赖 SRP,仅支持 URP/HDRP,内置管线不支持。若粒子数量达到上万量级,可考虑用其制作。
更多粒子系统优化方案
- Optimizing particle effects for mobile applications
- Built-in render pipeline: Particle system optimization
86.2 知识点代码
Lesson85_性能优化_GPU_粒子系统优化_GPU侧优化思路.cs
public class Lesson85_性能优化_GPU_粒子系统优化_GPU侧优化思路
{
#region 知识回顾 粒子系统 GPU侧优化思路
//GPU
//优化目标 —— 少算像素
//降低屏幕上计算的像素数
//降低每个像素计算的内容
#endregion
#region 知识点一 控制OverDraw
//粒子大部分是半透明的,为了进行透明度混合
//往往不会进行深度写入,导致多个粒子叠加时同一像素被反复计算
//我们需要尽量减少这种计算
//1.减少粒子数量和粒子尺寸
// 因为 粒子数量 x 粒子尺寸 决定了 覆盖面积
//2.使用修剪透明度(Trim Alpha),裁剪掉贴图边缘的空透明区域
// 一般在美术导出图片前裁剪掉无效透明区域,或用图集工具自动忽略无效透明边缘
// 比如一张图512x512,但是其中的有效图形只占128 x 128的区域,完全可以把四周透明区域裁剪掉
//3.设置合理的 开始大小参数(Start Size)
// 避免大面积的满屏效果
//4.使用LOD
// 远处粒子直接换成雾面贴图或后处理效果的体积雾效果
//等等
#endregion
#region 知识点二 降低几何复杂度
//粒子也需要被渲染才能被我们看到
//降低几何复杂度,可以减少着色器中顶点处理部分的开销
//1.使用广告牌粒子
// 广告牌效果一般只需要使用一个四边形即可
//2.合理使用拖尾模块(Trails)
// 拖尾效果会把单个粒子拉成数十个顶点,会增加GPU顶点处理阶段的压力
// 我们可以调大拖尾效果的采样间距,限制最大顶点数
//3.合理使用网格粒子
// 如果一定要使用网格粒子,也尽量使用低模
// 因为一个网格粒子可能就会包含数百顶点,会大幅增加顶点处理压力
#endregion
#region 知识点三 减少片元着色开销
//粒子也需要被渲染才能被我们看到
//如果从渲染层面上,减少着色器中计算开销就可以降低粒子的开销
//1.降低着色器复杂度
// 减少纹理采样,尽量用一张纹理即可,尽量避免使用法线、遮罩相关纹理
// 避免在片元着色器中产生分支,或使用高开销函数
// 大多数情况下不太需要给粒子投射阴影
// 受光影响也需谨慎使用
//2.优化贴图
// 可以减少序列帧动画帧数,降低其分辨率
// 可以压缩贴图,移动端优先使用ASTC、ETC2等压缩格式
//等等
#endregion
#region 知识点四 替代手段
//在一些表现效果中,我们应该尽量使用不那么消耗性能的手段去替代高消耗表现
//比如:
//1.能用不透明就不要使用半透明粒子
// 一些游戏中的弹壳、碎屑效果,我们可以使用几何渲染队列的粒子,不要使用半透明
//2.后处理效果替代
// 大范围的雾、火焰,可以改为屏幕后处理效果去实现
//3.使用VFX Graph(2018.3 引入的一套基于节点的 GPU 粒子特效系统)
// 依赖于SRP管线,只支持URP和HDRP项目,内置渲染管线不支持
// 如果你的粒子效果有上万粒子,可以考虑使用它来制作
#endregion
#region 知识点五 更多粒子系统优化方案
//1.为移动应用优化粒子效果
// https://learn.unity.com/tutorial/optimizing-particle-effects-for-mobile-applications
//2.内置渲染管线中的粒子系统优化
// https://docs.unity3d.com/6000.2/Documentation/Manual/particle-system-optimization.html
#endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com