抛砖引例
一般来说,粒子系统的开销主要与其更新的粒子系统数以及每个粒子系统包含的粒子数相关。我们打开UWA测评报告中的“粒子系统”界面即可看到对应的详细信息,在此我们以“星辰奇缘”在红米Note2上的性能数据为例:
如上图,几个参数指标分别为:“ParticleSystem.Update CPU峰值”,“ParticleSystem.Update CPU均值”,“ParticleSystem 渲染峰值”,“ParticleSystem 渲染均值”。接下来是”ParticleSystem.Update ”和“ParticleSystem 渲染耗时“的走势图,Unity 5.3以前的版本主要看这两个函数,之后的版本我们需要另外考量其他几个函数。同时,我们可以通过与图表交互,查看每一场景、每一帧的具体CPU占用情况。
同样地,比起峰值,我们建议开发团队多多关注下主体范围的情况(点开”分析与建议“)。
上图中,该游戏的ParticleSystem.Update的CPU占用峰值为3.8 ms,均值为0.3 ms,主要集中在0.1~0.5 范围内(5%~95%),该值处于合理范围(<3 ms)之内。粒子系统渲染耗时均值为15.6 ms,主要集中在0.5~2.8范围内(5%~95%),该值处于合理范围(<3 ms)之内,整体表现非常出色,但是大部分项目的实际情况可能与之大相径庭,特别是游戏进入战斗副本时CPU耗时会骤然升高,那如何优化呢?我们继续往下看:
优化心得
之前我们也提及,游戏打怪过程中渲染模块的主要开销为半透明渲染所占据。而究其原因,主要是技能特效播放时的粒子特效所致,如下图:
大家会常常发现自己的游戏在副本打斗的过程中粒子系统开销较大,进入副本时ParticleSystem.Update CPU走势一下子就上去了:
对此,我们一般建议研发团队根据移动设备对粒子系统进行管理,对于低端设备尽可能降低粒子系统的复杂程度和屏幕覆盖面积,从而降低其渲染方面的开销,提升低端设备的运行流畅性。具体做法如下:
- 在中低端机型上降低粒子数、同屏粒子数,比如仅显示“关键”粒子特效或自身角色释放的粒子特效等,从而降低Update的CPU开销;
- 尝试关闭离当前视域体或当前相机较远的粒子系统,离近后再进行开启,从而避免不必要的粒子系统Update的开销;
- 尽可能降低粒子特效在屏幕中的覆盖面积,覆盖面积越大,层叠数越多,其渲染开销越大;
4.对于Unity 5.x项目,可尝试升级到5.3以后版本,因为Unity在5.3版本后对粒子系统底层进行了深入的优化。
粒子系统拼合
特别地,大家会在粒子系统渲染耗时的走势图底端看到“粒子系统拼合“,在这里我们能查看其粒子系统的具体耗时、拼合的粒子系统数以及未拼合的粒子系统数。
关于粒子系统拼合,是指引擎会将若干个材质相同且深度相同的粒子系统在渲染前进行合批(Batch),从而通过一个Draw Call来对其粒子系统进行渲染,进而降低粒子系统的渲染开销。
补充:粒子系统的Draw Call动态拼合与半透明物体的动态拼合机制相当(粒子基本都是半透明材质)。而对半透明物体,由于其渲染顺序的限制(必须从后向前渲染,以保证渲染结果的正确性),动态拼合只能对渲染顺序相邻且材质相同的物体有效。而在决定半透明物体的渲染顺序时,Unity首先会按Shader中的RenderQueue进行排序;其次(相同RenderQueue时),会根据每个半透明物件到屏幕的距离,距离大的优先渲染。
因此,需要尽可能地将相同材质的粒子系统放在比较接近的深度下,才能更多地使动态拼合生效。但通常由于相机的运动、粒子系统的分散分布等原因造成粒子系统之间的穿插,能够动态拼合的数量往往都是很少的,所以我们在粒子系统模块看到的开销分布通常类似该图,主要都是未拼合粒子系统造成。
经过我们验证,Unity 5.3.5 版本中恢复了对粒子系统的动态合批功能(可尝试添加多个默认的粒子系统,观察Batches的数量变化)。
原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。