86.粒子系统GPU侧优化思路

86.性能优化-GPU-粒子系统优化-GPU侧优化思路


86.1 知识点

粒子系统 GPU 侧优化思路

GPU 侧的目标是少算像素:降低屏幕上参与计算的像素数,以及每个像素计算的内容。

控制 OverDraw

粒子多为半透明,为做透明度混合往往不写深度,导致多粒子叠加时同一像素被多次计算,需要尽量减轻这类 OverDraw:

  1. 减少粒子数量和粒子尺寸:覆盖面积大致由「粒子数量 × 粒子尺寸」决定。
  2. 使用 Trim Alpha(修剪透明度):裁掉贴图边缘的无效透明区域。可在美术导出前处理,或用图集工具自动忽略透明边。例如 512×512 的图若有效内容只有 128×128,可把四周透明区裁掉。
  3. 设置合理的 Start Size(开始大小):避免过大造成满屏覆盖。
  4. 使用 LOD:远处用雾面贴图或后处理体积雾等替代高精度粒子。

降低几何复杂度

粒子同样要经过顶点阶段,降低几何复杂度可以减轻顶点处理开销:

  1. 使用广告牌粒子:广告牌一般一个四边形即可。
  2. 合理使用拖尾模块(Trails):拖尾会把一个粒子拉成很多顶点,增加顶点阶段压力。可调大采样间距、限制最大顶点数。
  3. 合理使用网格粒子:若用网格粒子,尽量用低面数模型,单个网格粒子就可能上百顶点,会明显增加顶点负担。

减少片元着色开销

从渲染层面降低着色器计算量,即可降低粒子开销:

  1. 降低着色器复杂度:减少纹理采样,尽量单张贴图,少用法线、遮罩等;避免片元中的分支和高开销函数;粒子一般不必投射阴影,光照也需谨慎。
  2. 优化贴图:可减少序列帧数量、降低分辨率;压缩贴图,移动端优先使用 ASTC、ETC2 等格式。

替代手段

在满足表现的前提下,用低成本方案替代高消耗表现:

  1. 能用不透明就不用半透明:如弹壳、碎屑等可用几何队列的不透明粒子,避免半透明排序和混合。
  2. 用后处理替代:大范围雾、火焰等可用屏幕后处理实现。
  3. 使用 VFX Graph(Unity 2018.3 起提供的基于节点的 GPU 粒子系统):依赖 SRP,仅支持 URP/HDRP,内置管线不支持。若粒子数量达到上万量级,可考虑用其制作。

更多粒子系统优化方案


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

×

喜欢就点赞,疼爱就打赏