背景

出于Unity的粒子系统(以下简称粒子系统)程序运行效率与美术生产效率,以及灵活性比Spine高,把之前用Spine制作粒子效果的流程转换为粒子系统来制作,但在使用过程中需要注意一些点,下文从程序运行效率方面列举了一些注意事项。

尽量少的DC

1.使用图集让不同的粒子系统共享材质

同时显示的粒子系统,尽量使用同一个材质,把用到的纹理放到一个图集里(建议这些纹理放到同一个文件夹里面,同UI管理方式,图集会自动生成,制作时可手动创建图集),粒子系统中勾选Texture Sheet Animation模块,Mode模式选择Spite,然后把Sprite拖进去,如下图:

2.控制渲染顺序

把不同材质的发射器赋予不同Order in layer值,相同材质的发射器使用相同的Order in layer值,这样可以避免材质打断从而导致和批失败。若果不同材质使用了同一个Order,渲染机制在遇到这些透明对象重叠时,会根据从远到近(油画家算法)渲染这些物体,如果相邻的渲染对象是同一个材质会自动合并成一个DC,假设当前物体对应的材质排序为AAB,会消耗掉2个DC,但是如果排序是ABA时就会消耗掉3个DC,当然这种情况只有A和B有OverDraw下才会发生,否则仍然只占2个DC,但是粒子系统发生OverDrall频率是比较高的,所以还是建议同屏显示时用一个材质就独占一个Order。

Oreder设置如下图:

注意:全局只有一个材质时改order不会破坏合批。

尽量少的OverDraw

因为粒子大部分情况下是透明的,在像素重合时有做AlphaBled,移动设备上的GPU架构是基于TBR的,即使Alpha混合是在高速的On-Chip Memory内进行,但是带Alpha混合的像素与像素之间不能启用早期Early Z优化,因此Overdraw的像素会对性能造成一定影响,通过Scene视图的可以查看OverDraw情况,颜色越亮表示OverDraw越严重,如下图:

为了保证尽量少的OverDraw可以参考以下几点:

1.纹理尽量小;

2.粒子尽量不覆盖;

3.粒子数量尽量少;

4.非必要不要使用拖尾效果;

5.考虑该重叠效果能否用其他代替,例如UV动画(不管那种方式,必定破坏合批,因为内部使用了MaterialPropertyBlock实现,但shader没有使用GPUInstacing),序列帧(用UV实现也会打破合批)代替;