6

粒子系统优化:Mesh模式下的优化策略

 3 years ago
source link: https://blog.uwa4d.com/archives/UWA_Pipeline24.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在上一期《动画优化:关于AnimationClip的三两事》中,我们针对动画优化中的“AnimationClip的压缩方式”以及“AnimatorController挂载的AnimationState”做了解释。这些看似细小的知识点,很容易在大家的开发和学习过程中被疏忽,而长期的问题积累最终都会反映到项目的性能表现上。为此,我们将这些规则列出,并且以一个个知识点的形式向大家逐一解读。

本期,我们将面向粒子系统,讲解UWA本地资源检测中的规则:“网格发射数超过5的粒子系统”、“检测粒子系统使用的网格Read/Write选项”、“引用网格面片数超过500的粒子系统”和“引用纹理数超过5的粒子系统”。我们将力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。


1、网格发射数超过5的粒子系统

1.png

关于粒子系统的定义,我们在此不再赘述。我们重点来看一下粒子系统的渲染模式。

2.png

粒子的渲染模式可分为两大类:2D的Billboard(公告牌)图形模式和Mesh模式。Billboard是3D游戏中用的非常多的一种技术,使用该模式,粒子会以一个平面的形式存在,并始终以一定的角度对着我们的镜头。举个例子来讲,场景中有一棵树,是实体存在的;但在各种Billboard模式下,你只需要看到这棵树的一个“面”。在展示效果上表现其实一样,但渲染一个“面”和渲染一整个实体,前者在消耗的内存和运算量上会更有优势。

Billboard模式,粒子会始终面向摄像机;

3.png

Stretched Billboard模式下,粒子在面向摄像机的同时,会在速度的方向上进行拉伸,可以设置粒子的各种缩放和拉伸效果;

4.png

Horizontal Billboard模式下,粒子平面会和XZ面平行;

5.png

Vertical Billboard模式下,粒子平面在面向摄像机的同时,会在Y轴方向上直立(垂直于XZ平面);

6.png

而“Mesh”模式就是我们今天的主题。这个模式允许粒子系统发射3D网格而非2D的Billboard,以此来实现更为复杂和贴合需求的粒子效果。

7.png

3D网格性能开销显然是高于2D的Billboard的。如果粒子系统的发射的网格数量过大,会带来较高的CPU计算开销、GPU渲染压力甚至较高的堆内存分配。所以我们对使用Mesh进行渲染的粒子系统的“最大粒子数”要求更为严苛。一般的粒子系统中,粒子发射数上限建议不超过30(我们在之前的文章中有进行讨论,详见《【性能黑榜】掌握了这些规则,你已经战胜了80%的对手!》)。经由UWA的测试结果表明:渲染模式为Mesh、网格发射数在不超过5的情况下,能够维持粒子效果和性能消耗上的一个相对平衡。

所以开发团队在本条规则执行后,需要对筛选出来的粒子系统进行显示效果和性能消耗上的平衡考量,并对相应的粒子系统进行修改。


2、所使用的网格未开启Read/Write选项的粒子系统

8.png

由于粒子系统的渲染对象从传统的粒子变成了3D网格,所以引用的网格对象本身的属性也会对整个粒子系统产生影响。在这种情况下,很多针对网格的优化建议也同样适用于Mesh模式下的粒子系统,只不过针对特定应用环境,部分优化建议需要“反着看”。

在之前的文章《网格优化:溃堤之穴,一个也不能放过》中,我们对于网格的Read/Write选项进行过一定的说明。仅仅针对网格而言,我们是不建议开启相关的读写权限。

但是在粒子系统应用中,往往需要去实现各种各样的动态效果。所以当渲染模式为Mesh时,网格就需要开启Read/Write选项以实现对3D网格的动态修改,来更好地实现相应的渲染展示效果。

Unity官方文档告诉我们,网格必须设置为Read/Write Enabled才能在粒子系统上工作。若不开启,在某些设备上运行时,可能会出现模型丢失的情况。可见问答:https://answer.uwa4d.com/question/5cf732fed27511377098284e。因此我们将该类异常的资源检测出来,希望研发团队进行规范,防止出现意外的显示结果。


3、引用网格面片数超过500的粒子系统

9.png

和上一条规则不同,这条便是网格优化在粒子系统中的正向应用。在以前文章《那些年给性能埋过的坑,你跳了吗?》中,我们对于网格的面片数有过相关的简单讲解。对3D网格而言,过多的面片数会带来内存,加载和渲染上的额外消耗。在粒子系统中也是同样如此。

在Mesh模式下,发射的3D网格对面片数的要求也是同样严苛的。所以开发团队需要在本条规则下,去检查相关粒子系统引用的网格是否存在面片数过多的情况,并视实际的表现效果和性能消耗去决定是否需要做出相关的修改。


4、引用纹理数超过5的粒子系统

10.png

在之前的文章《材质优化:如何正确处理纹理和材质的关系》中,我们简单讲了下材质的Shader中引用了过多纹理会在内存和计算上带来的影响。

11.png

同样的,在粒子系统中,如果在材质内包含了过多的引用纹理,也同样会导致存储和运算上的额外消耗,从而对整个的粒子系统带来不必要的负担。

所以开发团队在为纹理系统引入材质时,需要关注相关材质内引用的纹理数量。在满足使用的前提下,从材质做瘦身,从而为整个粒子系统调优。


以上,大家其实可以发现,看似各个独立的部分:网格、粒子系统、材质和纹理等,其实在优化上都有着互相的关联。所以面对项目优化,开发团队要以一个整体的高度去看待项目的各个部分。

希望以上这些知识点能在实际的开发过程中为大家带来帮助。需要说明的是,每一项检测规则的阈值都可以由开发团队依据自身项目的实际需求去设置合适的阈值范围,这也是本地资源检测的一大特点。同时,也欢迎大家来使用UWA推出的本地资源检测服务,可帮助大家尽早对项目建立科学的美术规范

9.png

我们已支持Luacheck功能啦~
我们已支持粒子特效检测~
下周会有重磅新功能推出喔
这么多实用贴心的功能
还不走你~

万行代码屹立不倒,全靠基础掌握得好!

性能黑榜相关阅读

《那些年给性能埋过的坑,你跳了吗?》
《那些年给性能埋过的坑,你跳了吗?(第二弹)》
《掌握了这些规则,你已经战胜了80%的对手!》


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK