自推出以来,UWA的本地资源检测已经成为了大家日常开发中必不可少的“左膀右臂”。近期,本地资源检测又迎来一轮大更新,新规则范围涉及多个模块,帮助研发团队更全面地检测资源问题,快来了解下吧!
1. 贴图中无用的透明区域过多
贴图文件中的Alpha通道一般用来表示透明度,当其设置为0时,贴图的视觉表现就是“透明”,不会对上下层的展示效果产生视觉影响。所以如果一张贴图中Alpha为0的区域占比过大,说明其大部分都是“皇帝的新衣”,实际有用区域只占很小一部分。
如上图,贴图中只有下方的部分区域才属于“有用区域”,其余大部分都是无用或不影响使用的透明区域。
本条规则会筛选出那些“透明pixel数量占比大于pixel总数量75%”的贴图,以供用户进行进一步的判断和设置,筛选时本条规则会自动忽略类型为Normal map、 Editor GUI and Legacy GUI以及Sprite(2D and UI)的纹理资源。对于被判定为失败的资源,UWA建议裁剪掉透明区域,尽量只保留有用的贴图部分,从而达到贴图资源的有效利用。
2. 动画的导入设置未关闭Resample Curve
Resample Curve为Unity中动画资源的输入(fbx类)选项之一。从外部软件(例如maya)输入进Unity的动画资源会经过Unity的Resample Curve功能,从而改变Unity动画数据的存储方式:将原先动画资源使用的Euler数据转化为Unity用的Quaternion数据,以保证该动画在Unity中的效果。
Unity 5.3版本之后,此选项在Unity中默认保持勾选并且官方建议开启。在实际应用中,Resample Curve的开启会一定程度上增加动画曲线的关键帧,使得动画更加平滑。
但勾选Resample Curve的同时,也会导致导入的AnimationClip占用的包体较大,运行时的内存占用也会提高。此外,它也有可能使得动画曲线中的step tangent出现采样错误,从而导致动画曲线与原先不符。
Resample Curve对曲线中的pre-rotation和post-rotation不产生效果,而且对标名为Humanoid和Legacy的动画来说,Resample Curve选项并不开放。
所以UWA建议在不影响动画效果的情况下,关闭该选项以减少内存与存储空间的占用。
3. 没有使用Optimize Sampling Rate的PCM音频
对于PCM格式的音频,我们在之前的规则解读文章《3分钟就能掌握的视频/音频优化技巧!》中做过简单介绍。
在Unity中,对于使用PCM和ADPCM压缩模式的音频,项目团队可以在Sample Rate Setting中对音频进行进一步的设置。
Preserve Sample Rate——遵循原音频的采样率。
Optimize Sample Rate——根据Nyquist theorem(抽样定理),选择不会对音频质量产生影响的最低采样率。
Override Sample Rate——手动对输入音频的采样率进行调整。一般不建议选择此项。
Nyquist theorem(抽样定理):在“模拟信号-数字信号”的转换中,假设给定的模拟信号的最高的频率成份(用赫兹表示)是fmax。依照Nyquist定理,取样率必须至少是2 fmax,或最高的模拟频率成份的两倍,这样才能保证在“模拟-数字-模拟”的过程中,模拟信号不失真。
Sample Rate选择Optimize Sample Rate,Unity会根据音频的表现效果,选定合适的采样率。比如原音频频率为20khz却有60khz的采样率,如果Nyquist theorem判断不需要使用60khz采样率而只需要40khz采样率就能有完好的效果时,Unity会将音频文件从原先60khz的采样率降低为40khz的采样率。
这样就能减少音频采样率,从而降低音频文件的内存占用,也能进一步减小AssetBundle包的大小。项目团队可以根据本条规则的筛选结果,对相关的PCM音频进行进一步的检查和判断。
4. 音频使用了过高的Vorbis和MP3压缩
Vorbis和MP3都属于有损压缩,在音频的压缩格式中进行选择后,就可以通过对Quality进行调整,以选择合适的音频质量。
Audio Quality的影响主要体现在AssetBundle包的大小:在内存占用上,Quality数值越高,内存占用越大;但当Vorbis的Quality从89到88时,AssetBundle包文件会大幅度减小;MP3的Quality从100到98时,AssetBundle包体积也会大幅度缩减。也可按照如下的表格进行调整。
表格作者:Zander Hulme
参考文献:《Unity Audio Import Optimisation - getting more BAM for your RAM》
本条规则会筛选出这些Quality过高(规则的默认阈值为50,最低可设为35)、采用了Vorbis或MP3压缩格式的音频,项目团队可以对照上述表格和文献说明,实际操作并选择合适的Quailty数值。
5. 粒子系统中使用了Standard Shader
我们在之前的文章《【Shader优化】破解变体的“影分身”之术》中,对Shader和相关的变体知识进行了较为详细地介绍,所以对Shader相关的知识,在此就不再赘述。
针对本条规则,对于使用了Standard Shader的粒子系统,Standard Shader可能生成非常多的变体,其加载耗时会非常高,ShaderLab内存占用也比较高,所以不建议项目团队直接在项目中使用。
6. 勾选了Apply Root Motion的Animator组件
这个属性与“动画播放和骨骼信息”的同步有关。
不勾选的时候,模型在播放动画(比如跑动)的时候,无论是动画播放时还是播放结束后,模型实际的动作、位置都没有发生变化。
而勾选Apply Root Motion后,在播放动画的实时,模型的动作、位置等都和实际所见保持一致。
勾选此选项后,Unity在更新动画时会将Root的运动信息应用到Animator所在的GameObject上,从而产生一定的开销。所以一般对于主玩家这样的物体,在要用动画控制人物前进的情况下,项目团队需要勾选Animator组件中的Apply Root Motion,以完成运动信息的同步。
除此以外,UWA建议在Import Settings中将动画的“Root Motion” bake到曲线中,并取消勾选Apply Root Motion。以降低相关的开销。
7. 缺失Renderer的LOD Group组件
在Unity中,LOD是一种“空间换时间”的常见做法:在GameObject上添加LOD Group组件,当摄像机距离物体较远的时候,显示是低精度、低面数和细节可以忽略的“低模”;而当摄像机拉近的时候,则切换为高精度、高面数和细节丰富的“高模”。
这样,虽然因为有多个模型而增加了一部分内存的开销,但也相应地,可以减少远景渲染计算,提高了项目运行的流畅度。
但是,如果为GameObject添加了LOD Group组件,但其中某个LOD Level没有添加Renderer的话,那么在项目实际运行时,没有添加到LOD Level中的Renderer会在任何时候都进行渲染,造成显示上的错误,并带来额外的性能开销。
所以本条规则会帮助项目团队查漏补缺:筛选出相应的对象后,如果是LOD Level中漏掉了Renderer的情况,则把该补上的Renderer添加好;如果LOD Group组件是不需要的,则删除掉该组件。
以上,便是这次更新的7条关于主流资源检测的新规则。本次更新,还会涉及C#代码检测、全局设置项检测以及场景检测等多个模块的规则上新,我们将会在后续的文章中一并为大家做简单的讲解和介绍,敬请期待!
点击了解更多UWA Pipeline功能。