在上一期《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%的对手!》

Prefab优化:预制体中的各种细节选择相关推荐

  1. Unity 理解预制体(Prefab)和预制体变体(PrefabVariant)

    关于预制体的要点: 官方文档中已包含关于预制体都是详细介绍,这里不再赘述,以下要点仅供个人回顾以及总结. 官方文档快捷入口:(ง •_•)ง 预制体的创建 预制体两种修改方式 预制体实例的覆盖和撤销 ...

  2. [Unity][FlowCanvas] 预制体中新建的组件无法拖入 GameObject 类型的黑板的解决办法:关闭预制体之后再打开

  3. Unity预制体Prefab及其实例化(Instantiate)

    简介: 在Unity3D工程建设中,Prefabs(预设)是很常用的一种资源类型,是一种可以被重复使用的游戏对象 可以被置入多个场景中,也可以在一个场景中多次置入 在场景中增加一个Prefab,就是实 ...

  4. Unity -- 预制体与变体

    1.一个游戏物体的图标为蓝色的时候,表明这个游戏物体是通过预制体创建的 当我们在修改预制体的时候,通过预制体创建的游戏物体也会同步修改(给预制体添加组件的时候,通过预制体创建的游戏对象也会添加对应的组 ...

  5. Unity 一键制作预制体,一键修改预制体

    生成 .修改预制体属性 所用到的API PrefabUtility.SaveAsPrefabAsset(GameObject instanceRoot, string assetPath); Pref ...

  6. 关于修复预制体上UnityEngine.UI引用丢失的一种思路

    在开发项目过程中,如果出现了Unity版本变化,有可能会导致一些预制体上的UI组件丢失,特别是大量UI脚本,明明一看就知道这个是Text组件,但是一个大大的missing出现在预制体上,让人产生了莫名 ...

  7. Prefab优化:向预制体打出最有效的组合拳

    在上一期<粒子系统优化:Mesh模式下的优化策略>中,我们针对粒子系统中和网格相关的优化注意点和大家做了解释.这些看似细小的知识点,很容易在大家的开发和学习过程中被疏忽,而长期的问题积累最 ...

  8. Unity3D中的预制体Prefab

    目录 1.认识prefab 2.创建prefab 3. Prefab实例化 4.进入Prefab模式: 5.编辑Prefab: 6.Prefab嵌套: 7.Prefab变体: 8.编辑Prefab变体 ...

  9. Unity使用c#开发遇上的问题(六)(3dmax围绕指定中心旋转,unity中动态调用预制体并根据模型旋转指定角度)

    文章目录 前言 一.3dmax创建子弹.炮塔及武器库 1.相关模型 2.炮塔模型引入unity,无法绕旋转球旋转,重新调整 1.3dmax中默认炮管的中心点 2.选择层次界面 3.选择编辑工作轴 4. ...

最新文章

  1. postgresql之数据库管理
  2. 红帽集群套件RHCS四部曲(概念篇)
  3. 和我一起学VSTA(Visual Studio Tools for Applications )(一)
  4. ubuntu在线安装和卸载libusb
  5. 循序渐进学Python2变量与输入
  6. 加速国内 Github 访问,下载,的9种方案!
  7. 给python小白的几个小练习(附答案详解哦)
  8. HDC2020开发者大会鸿蒙,华为开发者大会HDC 2020将于9月10日开启 鸿蒙OS 2.0亮相
  9. 13. 为什么我们会需要 Pod?
  10. JMETER SLAVE和MASTER 分布式启动压测
  11. win8笔记本关闭小键盘
  12. 软件开发和DBA谁更吃香?有答案了
  13. 如何获取屏幕分辨率呢
  14. 值得关注的开源软件推荐
  15. html5网页构成要素有哪些,网页界面的构成要素
  16. EHub_tx1_tx2_E100 Cartographer 完美部署安装
  17. SpringBoot迷你天猫商城系统(附源码)
  18. 说说自己工作中的测试流程
  19. 2020年UI和UE的设计流行趋势揭秘!设计师最爱的是?
  20. 断章取义:关于红玫瑰和白玫瑰

热门文章

  1. wpsppt放映时间_怎么修改wps演示的放映时间 wps演示自定义修改放映时间的步骤方法...
  2. RHEL 6.5 下安装 ralink mt7601
  3. NetCore 创建、编辑PDF插入表格、图片、文字(二)
  4. java计算机毕业设计疆域特色农家乐系统源码+mysql数据库+系统+lw文档+部署
  5. Win11开启U盘移动硬盘写入缓存策略怎么设置
  6. U盘不能写入和删除。linux系统解决办法
  7. 【CVPR2021】Decoupled dynamic filter networks
  8. 红外线多点触摸技术按钮制作须知
  9. 在iPad上利用pythonista(python3.6)调用有道翻译API实现单词的批量翻译
  10. 合理使用ArrayMap代替HashMap