那些年给性能埋过的坑,你跳了吗?(第二弹)

那些年给性能埋过的坑,你跳了吗?(第二弹)

上周,我们罗列了在【性能黑榜】上的Top3规则。无论是大家在开发时的疏忽,还是相关知识点的缺失,这些问题的积累最终都会反映到项目的性能表现上。为此,我们将这些规则曝光出来,并且以一个个知识点的形式逐一解读。

今天,我们来继续剖析榜单上的其他问题,包括“包含空纹理采样的材质”、“未开启OptimizeGameObjects的Animator组件”和“包含Scale曲线的动画片段”这三条规则。我们将力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。

性能黑榜是指在【UWA本地资源检测】中前十名检测未通过的触发规则,近80%的项目已躺枪,值得大家高度重视。

1、包含空纹理采样的材质——91%的项目中招

我们在编写Shader时,会声明一些贴图进行计算。但在使用该Shader创建Material实例时,可能并不需要这些纹理,或者因为疏忽忘记对材质添加纹理,那么Unity会为材质赋予一个默认的“纹理”。这个情况虽然不会对计算结果和显示效果造成影响,但是Unity依然会对它进行相关的计算,从而产生性能上的消耗。

所以我们提供这条规则的检测,方便开发团队定位这些不需要用到纹理的材质,删除或注释掉相关的纹理声明,从而避免Unity进行不必要的计算,减轻GPU的压力;同时也能对那些原本预定添加纹理的材质进行判断,进一步优化材质的结构。

2、未开启OptimizeGameObjects的Animator组件——87%的项目中招

关于动画系统,我们知道Animation组件对应于Unity老版本的动画系统,而Animator为新版动画系统Mecanim所对应的组件。

使用Mecanim动画系统,我们可以在对应资源的Import Settings中开启"Optimize Game Objects"选项。

在不勾选的状态下,Unity在处理动画片段时,不会移除Transform的层级信息,导致在骨骼动画播放时产生不必要的CPU计算开销。

而在勾选之后,Unity会进行相关的优化。简单地说,那些只包含Transform组件的骨骼节点不会被Unity进行导入(但是可以通过在Extra Transform Paths中勾选对应骨骼名称来保留想要的骨骼节点)。相关的骨骼信息会被映射到avatar中,动画系统不用每帧再去更新这些骨骼节点(GameObject)的Transform,而是直接通过拿取avatar骨骼信息来实现更新蒙皮,表现动画,从而节省了CPU计算,降低动画开销。

这里需要说明的是:UI用的Animator组件是不支持OptimizeGameObjects的优化项的,不需要进行处理。所以本条检测规则中会过滤掉这部分Animator不再检测。

3、包含Scale曲线的动画片段组件——86%的项目中招

我们知道,Scale缩放动画是负责用来控制物体的缩小与放大的。那么Scale曲线的作用,就是记录一段动画中物体每一帧的缩放情况。

很多情况下,导入的动画资源当中仅涉及物体的空间位置变换,即Scale曲线值恒为1。所以对动画片段的展示效果没有产生任何影响,但整个曲线数据却是事实存在的,从而导致了内存上不必要的的浪费。

为了避免这种不必要的内存消耗,我们通过本条规则规则将这些包含Scale曲线的动画片段筛选出来,便于开发团队进行排查。

以上,便是这三条检测规则的解读,希望能帮到大家。

需要说明的是,每一项检测规则的阈值都可以由开发团队依据自身项目的实际需求去设置合适的阈值范围,这也是本地资源检测的一大特点。

后续我们将持续推出UWA性能黑榜系列的普适性阅读文章,帮助大家打扎实基本功。同时,也欢迎大家来使用UWA推出的本地资源检测服务,可帮助大家尽早对项目建立科学的美术规范

觉得本文太简单了?来加餐!
《轻量级流水线结合方案助力打造高品质游戏》完整课程可戳,下载在理APP即可免费获取。