Prefab优化:预制体中的各种细节选择

Prefab优化:预制体中的各种细节选择

在上一期《Shader:优化破解变体的“影分身”之术》中,我们针对UWA本地资源检测最新的Shader Analyzer功能所涉及到的新规则和相关知识点进行了讲解。这些看似细小的知识点,很容易在大家的开发和学习过程中被疏忽,而长期的问题积累最终都会反映到项目的性能表现上。为此,我们将这些规则列出,并且以一个个知识点的形式向大家逐一解读。

本期,我们将继续讲解UWA本地资源检测中和Prefab相关的规则:“使用了Outline的Text组件”、“使用了默认纹理的RawImage组件”、“不可见的RawImage组件”、“开启Prewarm的粒子系统”和“开启Collision或Trigger的ParticleSystem”。我们将力图以浅显易懂的表达,让职场萌新或优化萌新能够深入理解。


1、使用了Outline的Text组件

这里有两个概念需要和大家简单说明下。首先是Text组件,它是UGUI系统下的一个可以用于文本显示与编辑的控件。

在Text控件中我们可以对文本内容进行多种设置,比如字体类型、字体大小和对齐方式等。

然后是Outline组件。Outline组件和Shadow组件一般都用于对图片或者文字添加阴影效果。而且从形式上看,这俩基本没有区别。

而从效果上来看如下图,Outline用于添加轮廓效果 ,Shadow则是用于添加阴影效果;从性能上来看,Outline生成的网格Triangles会比Shadow多。

而且根据实际测试,如下图是一段文本分别在“无阴影效果”、“开启Shadow”和“开启Outline”时的顶点数情况。由图可知如果我们在Text组件中使用了Outline来实现轮廓效果,那么顶点数和网格数的上升会非常明显。

在这里我们推荐大家尝试使用TextMeshPro来实现相关的显示效果,在性能和展示效果上都优于Outline和Shadow。

所以在本条规则找出使用Outline的Text组件后,开发团队可视实际情况去选择是否保留Outline,或者换用TextMeshPro;也可以让美术人员直接做出美术字来使用,从根源上减少顶点数,降低性能开销。

2、使用了默认纹理的RawImage组件

在之前《Prefab优化:向预制体打出最有效的组合拳》一文中,我们简单说明了Image组件。Rawlmage组件和Image组件类似,都是UGUI系统下的图像组件。针对于Texutre设置的TextureType来说,Image组件只能使用TextureType为Sprite类型的资源;而RawImage使用的纹理资源可以设置为任意Type,需要注意的是,如果在RawImage组件内拖入的是TextureType为Sprite的纹理,其实是引用了Sprite内的原始纹理。从UGUI源码中看,RawImage类型的API函数很少,功能比较简单,而Image类型的功能较复杂。

如果Rawlmage组件的Texture属性没有赋值,那么会生成一张白色的默认纹理,这张白色的纹理存在性能开销。虽然不排除直接使用默认纹理的情况,但大部分的应用场景下,我们都会为Rawlmage组件添加符合场景和界面需求的纹理来达到预期的显示效果。

所以我们会找出这些使用默认纹理的Rawlmage组件,以供开发团队进行进一步的判别,方便大家及早发现并修改这类纹理使用不当的问题。

3、不可见的RawImage组件

这一条和我们在之前的文章《Prefab优化:向预制体打出最有效的组合拳》讲到的“不可见的lmage组件”非常相似。在大部分的应用情形下,“视觉上消失,但物理上存在”背离了作为图像组件的使用初衷。

当我们把Alpha值全为0(即透明不可见)的Texture资源导入到相关RawImage组件后,这种情况下,Rawlmage图像组件不仅没有为项目提供任何的展示效果,反而为项目带来了性能和计算上的额外占用与消耗。

当然,还是要强调一下,我们不能武断地排除RawImage组件不可视化的特殊应用,开发团队要根据项目的实际需求来进一步判断这些被本条规则筛选出的Rawlmage组件。

4、开启Prewarm的粒子系统

在Unity的粒子系统应用中,我们经常会接触到一个叫做“预热”(Prewarm)的概念。我们可以在粒子系统的初始化面板内进行Prewarm的相关设置。

开启Prewarm选项后,粒子系统会在加载后立刻执行一个完整的粒子发射周期,一般用于特定的粒子效果的展示需求。

最典型的就是火焰特效的应用,在某些场景过场中,例如战乱中一间燃烧的木屋。开启Prewarm选项,我们就能直接看到熊熊燃烧的大火,而不是看一遍火焰从小烧到大的过程(不然这就违和得离谱)。

在一些粒子系统渲染规模较大的场景中,如果开启Prewarm选项,会使得粒子系统在使用时的第一帧产生相对集中的CPU耗时,那么很可能会造成运行时局部卡顿,从而对整个项目的运行过程产生感官和体验上的明显影响。

所以本条规则会找出这些开启Prewarm的粒子系统,开发团队进行进一步的检查后,根据实际使用需求去决定是否需要关闭相关的粒子预热效果。

5、开启Collision或Trigger的ParticleSystem

在Unity中,粒子系统一般用于各种渲染效果,不具备实物特性。但在某些具体的应用中,我们希望粒子具有现实中的物理性质来更好地表现想要的效果。

比如在某些二战题材的军事游戏内,用粒子系统去表现M16防空车的弹幕射击。为了更好地实现曳光弹、燃烧弹的射击,碰撞和四散的效果,这时候就需要开启粒子系统的物理碰撞。

如图,这是粒子系统中的Trigger(触发器)和Collision(碰撞器)设置。简单来讲,合理使用这两个设置,就能很好地模拟出粒子的实物碰撞效果。甚至可以实现比如子弹跳弹后的变轨,雨水滴到湖面后的反弹等现实的物理性质。

不过这些物理碰撞效果的实现是以高额的物理计算消耗为代价的。在实际使用中,大部分的粒子系统只是承担了渲染的作用,并不涉及粒子与物体碰撞的效果反馈。所以在这种情况下,开启Collision或者Trigger并不会使得原有渲染效果有显著提升,反而会带来相当大的性能负担。

所以本条规则会找出这些粒子系统,以供开发团队检查,在确认当前ParticleSystem不需要实现物理特性后,开发团队就可以果断关闭相关属性设置以减小项目的性能开销和计算压力。

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

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

相关推荐
《UWA本地资源检测又更新|帮你把关Shader变体问题》

性能黑榜相关阅读

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