第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解
无论是CPU还是GPU,粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化,玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。
特效(Particle System)
游戏效果对于游戏呈现来说是必不可少的,Unity经常使用粒子效果系统
我们将从性能调优的角度介绍如何使用粒子系统,以及如何避免错误。 以下优化点很重要。
- 保持低颗粒数量,建议少于60
- 注意Noise模块消耗大的
- 粒子系统持续时间
- 粒子系统发射间隔
- 粒子系统发射模型面数,Mesh勾选静态,以便合并
- 共享材质,减少shader的复杂度
- 对象池,通过创建粒子池来重用粒子对象,避免频繁创建和销毁对象所带来的性能开销
- 粒子系统RingBuffer开关
- 粒子系统物理碰撞选项
- 粒子需要碰撞地面或者墙壁时,Collision中选择Planes模式
- 帧动画代替粒子系统、粒子系统表现烘培成序列帧动画
- 粒子特效引用的纹理数不宜过多,建议不超过5个,且纹理的大小也不宜过大,不越过256*256。
- 特效运行时DrawCall峰值不宜过高,建议控制在10以下。
- 特效运行时平均Overdraw率不宜过高,陪数控制在3倍以下,在Overdraw模式下不出红色最好。(Overdraw对性能影响最大,需特别留意)
- 减少Overdraw ,又提到了Overdraw,又提到了Overdraw
- 粒子大小与透明度,尽量使用较小的粒子,并避免使用过于复杂的粒子纹理,对于非常小的粒子,可以去除其alpha 通道以减少内存消耗
- 大面积使用粒子的情况下,尽量使用add模式,因为blend模式会渲染通道,消耗内存较大
- 如果粒子叠加层次比较多。尽量使用中空模型,会大大降低渲染压力
- shader的选择方面,特效一般情况使用mobile 模式下的shader
- 不要使用mesh collider
减少粒子数量
粒子的数量与负载有关,由于粒子系统是CPU驱动的(CPU粒子),粒子越多,CPU负载就越高。作为基本策略,将粒子数量设置为必要的最小值。根据需要调整粒子的数量。
有两种方法可以限制粒子的数量。
- 限制发射系统的发射数量particles emitted
- 在Max particles主模块中限制最大粒子数
限制发射模块的发射数量图
- Rate over Time时间速率:每秒发出的粒子数量
- Bursts>Count:粒子在Burst时间发射的数量
限制发射的最大粒子数量图
另一种方法是在主模块中使用Max Particles。在上面的例子中,超过1000的粒子将不会被释放
- 小心次级发射器
- 在减少粒子数量时,还应考虑Sub - Emitters模块。子发射器模块在特定时间产生任意粒子系统(在创建时,在生命结束时等)根据子发射器的设置,粒子的数量可能会立即达到峰值数量,所以在使用此模块时要小心。
注意Noise模块消耗大
噪声模块的质量很容易过载。噪声可以表达有机颗粒,常被用来方便地增加质量效果。因为它是一个经常使用的函数,所以应该注意它的性能。
Quality 窗口中的设置控制着生成的独特噪声样本数量。使用 Medium 和 Low 设置时,使用的柏林噪声样本较少,这些样本将在多个轴上重用,但会组合在一起以尽可能进行重用并隐藏这样的重用。这意味着当使用较低质量的设置时,噪声可能看起来不那么动态和多样化。但是,使用较低质量的设置时,可以获得显著的性能优势。
质量尺寸越高,负载越高。如果你不需要噪音,关闭噪音模块。如果需要使用噪点,请先将“质量”设置为“低”,然后根据需要增加“质量”。
粒子系统发射模型面数
粒子特效的网格发射数不宜过多,粒子的渲染模式可分为两大类:2D的Billboard(公告牌)图形模式和Mesh模式,Mesh性能开销较高,建议不超过5个,且Mash的面片数也要尽量少,建议不越过500。
减少Overdraw
通过优化场景布局和摄像机设置来减少Overdraw(即像素被多次绘制的情况),例如,使用遮挡剔除(occusion culling)技术来避免绘制被其他物体遮挡的物体。
这里再补充一些常见的优化思路
对于低端设备尽可能降低粒子系统的复杂程度和屏幕覆盖面积,从而降低其渲染方面的开销,提升低端设备的运行流畅性。具体做法如下:
(1)特效播放时平均Overdraw率过高
统计每帧参与渲染的像素的平均Overdraw,并取过程中最高的值。该值越大,特效导致GPU压力的可能性也会越高,建议对其进行检查。
(2)特效播放时DrawCall峰值过高
统计每帧的DrawCall数,并取过程中最高的值。该值较高时需要对其进行检查。
(3)特效总贴图内存过大
统计特效中包含的贴图总内存。该值较高时,可能是纹理使用过量,需要对其进行检查。
(4)特效运行时包含的ParticleSystem组件数量过多
统计特效中包含的ParticleSystem组件数。该值较高时,容易导致较高的渲染相关指标,以及较高的序列化耗时等,需要对其进行检查。
(5)特效播放时最大粒子数量过大
统计每帧的粒子数总和,并取过程中最高的值。该值越大,特效的更新开销可能也会越大。
(6)特效总贴图数量过大
统计特效中包含的贴图总数。该值较高时,容易导致较高的渲染相关指标,需要对其进行检查。
(7)开启Collision或Trigger的ParticleSystem
粒子系统建议不要开启Collison或Trigger功能,否则会有较高的物理开销。
(8)在中低端机型上降低粒子数、同屏粒子数,比如仅显示“关键”粒子特效或自身角色释放的粒子特效等,从而降低Update的CPU开销;
(9)尝试关闭离当前视域体或当前相机较远的粒子系统,离近后再进行开启,从而避免不必要的粒子系统Update的开销;
(10)尽可能降低粒子特效在屏幕中的覆盖面积,覆盖面积越大,层叠数越多,其渲染开销越大。
今天是2024年12月1日
重复一段毒鸡汤来勉励我和你
你的对手在看书
你的仇人在磨刀
你的闺蜜在减肥
隔壁的老王在练腰
而你在干嘛?