Unity性能优化_粒子特效(Particle System)
对CPU和GPU来讲是一个性能消耗的大户。以下记录一些针对移动端的优化方式与思考。优化方式一 限制同屏Max粒子数数量尽可能少推荐30-50个粒子系统300-500个总粒子数2021年。二 设计复杂度避免粒子发射器之间的嵌套迭代控制在1-2层。三 面积占比尽可能小过大会影响像素填充率。四 贴图降低分辨率很小的粒子考虑去掉Alpha通道半透将产生大量的Overdraw。一般来说Overdraw可能是粒子特效消耗性能的最大因素。五 Shader发布移动端Shader用Mobile平台的。六 光照计算复杂度不接收阴影不产生阴影去掉灯光相关设置七 Render ModeBillboard优先于Mesh类型。对于Mesh类型DCC软件合并Mesh勾选Unity的Static选项如果骨骼骨骼数量少于30建议同一时间不超过5个单个顶点不超过500GPU实例化Enable Mesh GPU Instancing取消脚本交互物理碰撞注意去掉Mesh Collider八 限制发射速率 Loop Duration如果周期很小就会不断的生成发射器对CPU也有一定影响。九 剔除可见性更新可以在Unity的剔除系统中嵌入CullingGroup这样就可以使用边界球创建剔除区域。当该区域变为可见或不可见时会发送一条通知以便不可见时暂停粒子系统并在重新可见时恢复。这样做的缺点是屏幕之外的粒子会是静止的这可能对某些效果有影响。避免这个缺点的方法是将粒子系统模拟快进一些来伪装粒子系统在不可见时仍然工作的假象。参考Unity小技巧粒子系统性能-剔除转 - 其他资源 - Powered by Discuz!十 批处理粒子单独使用一个layer合批的效果会更好。减少材质数量用一个atlas纹理便于合批在shader中使用纹理坐标偏移。深度排序通过修改Order in Layer减少粒子渲染的穿插从而增大合批的概率。但通常由于相机的运动、粒子系统的分散分布等原因造成粒子系统之间的穿插能够动态拼合的数量往往都是很少的。十一 性能分级 LOD AIGC传统做法在性能分级的时候就是直接关闭/开启某些特效。更理想的情况应该是Lod但是人为预制将带来可观的工作量。所以是否可以利用AI实时预处理呢Profiler指标ParticleSystem.particleCount可以通过此统计同屏的粒子总数。如果是不想继续产生粒子可以在逻辑中统计然后根据需求使用pause等方式来控制粒子继续产生。ParticleSystem.ScheduleGeometryJobs是指在Culling之前主线程要等待子线程计算Particle的位置然后才能Culling。往往在战斗界面开销较高。考虑在中低端设备上尽可能降低粒子系统的复杂程度。采用剔除方式降低不必要的粒子系统Schedule开销。ParticleSystem.Draw调用次数对应的是粒子系统的DrawCall数量。考虑减少粒子系统的数量。可以通过使用TextureSheetAnimation的方式或者通过修改Order in Layer减少粒子渲染的穿插从而增大合批的概率。更多方案一 序列帧考虑替换为序列帧实现比如一些细小的蝴蝶或蜜蜂群的效果。二 Job化 DOTS三 Visual Effect Graph如果要创建包含大量粒子的视觉效果并且需要高度可自定义的行为请使用 Visual Effect Graph 而不是内置粒子系统。Visual Effect Graph 利用 GPU 模拟粒子行为可模拟的粒子数量远远超过内置粒子系统。参考Particle systems in Unity – Unity 手册 (unity3d.com)