性能优化

Reference

lwwhb/Unity2022_SUNTAIL_Stylized_Fantasy_Village_Optimization: 针对AssetStore上的SUNTAIL - Stylized Fantasy Village项目系统级优化 (github.com)
UPR - Unity专业性能优化工具
音频剪辑 - Unity 手册
Model Import Settings 窗口 - Unity 手册
导入一个模型 - Unity 手册
https://docs-redirects.unity.com/class-TextureImporter?version=2021.3

资源导入

由于资源众多无法一个一个检查,使用UPRAssetChecker工具检查Unity资源,并且根据建议改进资源。

音频

音频剪辑 - Unity 手册

双声道

根据UPRAssetChecker的建议,对两个声道相同音频的资源可以采用Force To Mono强制压缩为单声道。

压缩格式

Compression Format,对于不同平台下需要了解对应平台的音频压缩算法,具体来选择压缩格式。

移动平台大多数声音尽量采用Vorbis压缩设置,IOS平台或不打算循环的声音可以选择MP3格式,对于简短、常用的音效,可以采用解码速度快的ADPCM格式(PCM为未压缩格式)

音频加载方式

对于音频的加载方式,可以根据播放的音频类型不同更改,比如: 背景音乐等事件较长的音乐可以采用Streaming流式加载,这样不会使得音频播放不会卡顿。

采样率

音频的采样率是音频体积的重要指标,通过重新覆盖采样率,压缩阴平大小。

移动平台对音乐音效统一采用单通道设置(Force to Mono),并将音乐采样频率设置为22050Hz

源大小与导入大小

在此提示窗口中查看,原资源文件与更改导入配置后的资源文件大小,与压缩比率。

模型

Model Import Settings 窗口 - Unity 手册
导入一个模型 - Unity 手册

DCC工具导出设置

不太了解这些

  • Unity 支持多种标准和专有模型文件格式(DCC)。Unity 内部使用 .fbx 文件格式作为其导入链。最佳做法尽可能使用 .fbx 文件格式,并且不应在生产中使用专有文件格式。

  • 优化原始导入模型文件,删除不需要的数据

    • 统一单位
    • 导出的网格必须是多边形拓扑网格,不能是贝塞尔曲线、样条曲线、NURBS、NURMS、细分曲面等
    • 烘培Deformers,在导出之前,确保变形体被烘培到网格模型上,如骨骼形变烘培到蒙皮权重上
    • 不建议模型使用到的纹理随模型导出
    • 如果你需要导入blend shape normals,必须要指定光滑组smooth groups
    • DCC导出面板设置, 不建议携带场景信息导出,如不建议导出摄像机、灯光、材质等信息,因为这些的信息与Unity内默认都不同。除非你自己为某DCC做过自定义导出插件。
  • 最小化面数,不要使用微三角形,分布尽量均匀

  • 合理的网络拓扑和平滑组

  • 尽量少的使用材质个数

  • 尽可能少的使用蒙皮网格

  • 尽可能少的骨骼数量

  • FK与IK节点没分离,IK节点没删除

模型动画

对于没有动画的模型,取消其动画导入选项Import AnimationMaterial Creation Mode选项

模型场景导入设置

我们可以关闭Import Light Import Camera Import Visibility等选项

模型Mesh导入设置

对于制作流程规范的模型,一般可以开启模型压缩。

对于无需在运行时改变的模型,一帮关闭其Read\Write选项,开启此选项,会在运行时复制,一个副本,用于修改。

对于无需非常精确碰撞检测的模型,Generate Collider一般关闭。

模型Geometry导入设置

不需要rigsBlendShapes尽量关闭

如果可能,禁用法线或切线,Normal Tangent

纹理的基本概念

这一集介绍的很详细,我复制的原文档

纹理类型

Default This is the most common setting used for all Textures. It provides access to most of the properties for Texture importing. For more information, see the Default Texture type.
这是所有纹理最常用的设置。它提供对纹理导入的大多数属性的访问。有关详细信息,请参阅默认纹理类型。
Normal map The Normal map texture type formats the texture asset so it’s suitable for real-time normal mapping. For more information, see the Normal map texture type documentation.
法线贴图纹理类型对纹理资源进行格式化,因此适合实时法线贴图。有关更多信息,请参阅法线贴图纹理类型文档。

For more information on normal mapping in general, see Importing Textures.
有关法线贴图的更多一般信息,请参阅导入纹理。
Editor GUI and Legacy GUI 编辑器 GUI 和旧版 GU The Editor GUI and Legacy GUI texture type formats the texture asset so it’s suitable for HUD and GUI controls. For more information, see the Editor GUI and Legacy GUI texture type documentation.
编辑器 GUI 和旧版 GUI 纹理类型对纹理资源进行格式化,使其适用于 HUD 和 GUI 控件。有关更多信息,请参阅编辑器 GUI 和旧版 GUI 纹理类型文档。
Sprite (2D and UI) 精灵(2D 和 UI) The Sprite (2D and UI) texture type formats the texture asset so it’s suitable to use in 2D applications as a Sprite. For more information, see the Sprite (2D and UI) texture type documentation.
Sprite(2D 和 UI)纹理类型格式化纹理资源,因此适合在 2D 应用程序中用作 Sprite 。有关更多信息,请参阅 Sprite(2D 和 UI)纹理类型文档。
Cursor The Cursor texture type formats the texture asset so it’s suitable to use as a custom mouse cursor. For more information, see the Cursor texture type documentation.
光标纹理类型格式化纹理资源,因此适合用作自定义鼠标光标。有关更多信息,请参阅光标纹理类型文档。
Cookie The Cookie texture type formats the texture asset so it’s suitable to use as a light cookie in the Built-in Render Pipeline. For more information, see the Cookie texture type documentation.
Cookie 纹理类型对纹理资源进行格式化,因此适合在内置渲染管道中用作轻量 cookie。有关更多信息,请参阅 Cookie 纹理类型文档。
光照贴图 The Lightmap texture type formats the texture asset so it’s suitable to use as a Lightmap. This option enables encoding into a specific format (RGBM or dLDR depending on the platform) and a post-processing step on texture data (a push-pull dilation pass). For more information, see the Lightmap texture type documentation.
Lightmap 纹理类型格式化纹理资源,因此适合用作 Lightmap 。此选项支持编码为特定格式(RGBM 或 dLDR,具体取决于平台)以及纹理数据的后处理步骤(推拉扩张通道)。有关更多信息,请参阅光照贴图纹理类型文档。
Directional Lightmap 定向光照贴图 The Directional Lightmap texture type formats the texture asset so it’s suitable to use as a directional Lightmap. For more information, see the Directional Lightmap texture type documentation.
定向光照贴图纹理类型格式化纹理资源,因此适合用作定向光照贴图。有关更多信息,请参阅定向光照贴图纹理类型文档。
Shadowmask The Shadowmask texture type formats the texture asset so it’s suitable to use as a shadowmask. For more information, see the Shadowmask texture type documentation.
Shadowmask 纹理类型格式化纹理资源,因此适合用作 Shadowmask 。有关更多信息,请参阅 Shadowmask 纹理类型文档。
Single Channel The Single Channel texture type formats the texture asset so it only has one channel. For information on the properties available only for the this type, see the Single Channel texture type documentation.
单通道纹理类型格式化纹理资源,使其只有一个通道。有关仅适用于此类型的属性的信息,请参阅单通道纹理类型文档。

纹理大小

选择合适纹理大小应尽量遵循以下经验:

  • 不同平台、不同硬件配置选择不同的纹理大小,Unity下可以采用bundle变体设置多套资源、通过Mipmap限制不同平台加载不同level层级的贴图。
  • 根据纹理用途的不同选择不同的纹理加载方式,如流式纹理加载Texture Streaming、稀疏纹理Sparse Texture、虚拟纹理VirtualTexture等方式。
  • 不能让美术人员通过增加纹理大小的方式增加细节,可以选择细节贴图DetailMap或增加高反差保留的方式。
  • 在不降低视觉效果的情况下尽量减小贴图大小,最好的方式是纹理映射的每一个纹素的大小正好符合屏幕上显示像素的大小,如果纹理小了会造成欠采样,纹理显示模糊,如果纹理大了会造成过采样,纹理显示噪点。这一点做到完美平衡很难保障,可以充分利用Unity编辑器下SceneView->DrawMode->Mipmap来查看在游戏摄像机视角下哪些纹理过采样,哪些纹理欠采样,进而来调整纹理大小。

通过场景中的 SceneView->DrawMode->Mipmap切换到MipMap观察纹理采样情况,红色的是过采样,蓝色的是欠采样

对于静距离下的欠采样,我们有必要提高纹理精度,对于远距离欠采样,可以根据后期的雾效等因素忽略。

纹理颜色空间

​ 默认大多数图像处理工具都会使用sRGB颜色空间处理和导出纹理。但如果你的纹理不是用作颜色信息的话,那就不要使用sRGB空间,如金属度贴图、粗糙度贴图、高度图或者法线贴图等。一旦这些纹理使用sRGB空间会造成视觉表现错误。

意思是单通道贴图不要使用sRGB。

纹理压缩

​ 纹理压缩是指图像压缩算法,保持贴图视觉质量的同时,尽量减小纹理数据的大小。默认情况下我们的纹理原始格式采用PNG或TGA这类通用文件格式,但与专用图像格式相比他们访问采样速度都比较慢,无法通用GPU硬件加速,同时纹理数据量大,占用内存较高。所以在渲染中我们会采用一些硬件支持的纹理压缩格式,如ASTC 、ETC、ETC2、DXT等。

​ 如下图为未压缩、ETC2、ASTC6x6三种格式文件大小对比,我们可以看到在质量相差不大的情况下ASTC6x6压缩下大小可以减少到接近未压缩的十分之一

纹理图集

纹理图集是一系列小纹理图像的集合,

  • 优点:

​ 一是采用共同纹理图集的多个静态网格资源可以进行静态合批处理,减少DrawCall调用次数。

​ 二是纹理图集可以减少碎纹理过多,因为他们打包在一个图集里,通过压缩可以更有效的利用压缩,降低纹理的内存成本和冗余数据。

  • 缺点

​ 美术需要合理规划模型,并且要求模型有相同的材质着色器,或需要制作通道图去区分不同材质。制作和修改成本较高。

纹理过滤

  • Nearest Point Filtering: 临近点采样过滤最简单、计算量最小的纹理过滤形式,但在近距离观察时,纹理会呈现块状。
  • Bilinear Filtering: 双线性采样过滤会对临近纹素采样并插值化处理,对纹理像素进行着色。双线性过滤会让像素看上去平滑渐变,但近距离观察时,纹理会变得模糊。
  • Trilinear Filtering: 三线性过滤除与双线性过滤相同部分外,还增加了Mipmap等级之间的采样差值混合,用来平滑过度消除Mipmap之间的明显变化。
  • Anisotropic Filtering: 各向异性过滤可以改善纹理在倾斜角度下的视觉效果,跟适合用于地表纹理

纹理Mipmap

对于屏幕

  • Mipmap纹理

逐级减低分辨率来保存纹理副本。相当于生成了纹理LOD,渲染纹理时,将根据像素在屏幕中占据的纹理空间大小选择合适的Mipmap级别进行采样。

  • 优点:

​ GPU不需要在远距离上对对象进行全分辨率纹理采样,因此可以提高纹理采样性能

​ 同时也解决了远距离下的过采样导致的噪点问题,提高的纹理渲染质量

  • 缺点:

​ 由于Mipmap纹理要生成低分辨率副本,会造成额外的内存开销

纹理

Texture Import Settings - Unity 手册 (unity3d.com)

Texture Shape

  • 2D 最常用的2D纹理,默认选项
  • Cube 一般用于天空和与反射探针,默认支持Default、Normal、Single Channel几种类型纹理,可以通过Assets > Create > Legacy > Cubemap生成,也可以通过C#代码 Camera.RenderToCubemap在脚本中生成
  • 2D Array 2D纹理数组,可以极大提高大量相同大小格式的纹理访问效率,但需要特定平台支持,可以通过引擎SystemInfo.supports2DArrayTextures接口运行时查看是否支持。
  • 3D 通过纹理位图方式存储或传递一些3D结构话数据,一般用于体积仿真,如雾效、噪声、体积数据、距离场、动画数据等信息,可以外部导入,也可运行时程序化创建。

AlphaSouce纹理Alpha源

对于需要Alpha通道的纹理,我们需要将选项选择为InputTextureAlpha,对于不需要Alpha通道的我们选择为NONE,可以节约内存。

AlphaIsTransparent是否半透明纹理

关闭此选择,使得Alpha信息只占用1bit,对于非半透明纹理我们一般关闭此选项。

Ignore Png file gamma

是否忽略png文件中的gamma属性,这个选项是否忽略取决于png文件中设置不同gamma属性导致的显示不正常,一般原图制作流程没有特殊设置,这个选项一般默认就好。

Streaming Mipmaps(Texture Streaming部分讲解)

Virtual Texture Only(虚拟部分讲解)

Generate Mip Maps

什么时候不需要生成MipMaps?

  1. 2D场景
  2. 固定视角,摄像机无法缩放远近

下面的术语不太清楚。

  • Border Mip Maps 默认不开启,只有当纹理的是Light Cookies类型时,开启此选项来避免colors bleeding现象导致颜色渗透到较低级别的Mip Level纹理边缘上
  • MipMap Filtering
    • Box 最简单,随尺寸减小,Mipmap纹理变得平滑模糊
    • Kaiser,避免平滑模糊的锐化过滤算法。
  • Mip Maps Preserve Coverage,只有需要纹理在开启mipmap后也需要做Alpha Coverage时开启。默认不开启。
  • Fadeout MipMaps, 纹理Mipmap随Mip层级淡化为灰色,一般不开启,只有在雾效较大时开启不影响视觉效果。

选择合适纹理过滤的最佳经验:

  • 使用双线性过滤平衡性能和视觉质量。
  • 有选择地使用三线性过滤,因为与双线性过滤相比,它需要更多的内存带宽
  • 使用双线性和 2x 各向异性过滤,而不是三线性和 1x 各向异性过滤,因为这样做不仅视觉效果更好,而且性能也更高。
  • 保持较低各向异性级别。仅对关键游戏资源使用高于 2 的级别。

各平台图片压缩

Texture compression formats for platform-specific overrides - Unity 手册 (unity3d.com)

图集问题

1.图集利用率低

2.尽量将生命周期相同的纹理打包在同一图集

否则无用纹理长时间占据内存空间。

3.避免不合理的透明纹理使用

会占据大量屏幕空间

4.序列帧未打成图集

5.重复纹理不合理通道图

6.内容相似纹理

分离变化贴图,并且使用九宫格模式。

7.渐变单色纹理

使用单像素纹理曲线代替

动画

Rig标签页

Animation Type

  • None 无动画
  • Legacy 旧版动画,不要用
  • Generic 通用骨骼框架
  • Humanoid 人形骨骼框架

选择原则:

  • 无动画选择None
  • 非人形动画选择Generic
  • 人形动画
    • 人形动画需要Kinematices或Animation Retargeting功能,或者没有有自定义骨骼对象时选择Humanoid Rig
    • 其他都选择Generic Rig,在骨骼数差不多的情况下,Generic Rig会比Humanoid Rig省30%甚至更多的CPU的时间。

Skin Weights

​ 默认4根骨头,但对于一些不重要的动画对象可以减少到1根,节省计算量。

也可以在质量中选择不同平台不同质量的骨骼数量。


Optimize Bones

​ 建议开启,在导入时自动剔除没有蒙皮顶点的骨骼

Optimize Game Objects

​ 在Avatar和Animatior组件中删除导入游戏角色对象的变换层级结构,而使用Unity动画内部结构骨骼,消减骨骼transform带来的性能开销。可以提高角色动画性能, 但有些情况下会造成角色动画错误,这个选项可以尝试开启但要看表现效果而定。注意如果你的角色是可以换装的,在导入时不要开启此选项,但在换装后在运行时在代码中通过调用AnimatorUtility.OptimizeTransformHierarchy接口仍然可以达到此选项效果。

Animation标签页

BakeAnimation

只有在DCC工具中使用了流体布料模拟才会开启此选项。

Resmple Curves

​ 将动画曲线重新采样为四元数数值,并为动画每帧生成一个新的四元数关键帧,仅当导入动画文件包含尤拉曲线时才会显示此选项

Anim.Compression 动画压缩

  • Off 不压缩,质量最高,内存消耗最大
  • Keyframe Reduction 减少冗余关键帧,减小动画文件大小和内存大小。
  • Keyframe Reduction and Compression 减小关键帧的同时对关键帧存储数据进行压缩,只影响文件大小。
  • Optimal,仅适用于Generic与Humanoide动画类型,Unity决定如何进行压缩。

Animation Custom Properties

​ 导入用户自定义属性,一般对应DCC工具中的extraUserProperties字段中定义的数据

Error 误差

动画变化在百分之几之类算作同一帧。

增加Error大小可以减小动画大小,但会降低动画质量

动画曲线数据信息

555

  • Curves Pos: 位置曲线
  • Quaternion: 四元数曲线 Resample Curves开启会有
  • Euler: 尤拉曲线
  • Scale: 缩放曲线
  • Muscles: 肌肉曲线,Humanoid类型下会有
  • Generic: 一般属性动画曲线,如颜色,材质等
  • PPtr: 精灵动画曲线,一般2D系统下会有
  • Curves Total: 曲线总数
  • Constant: 优化为常数的曲线
  • Dense: 使用了密集数据(线性插值后的离散值)存储
  • Stream: 使用了流式数据(插值的时间和切线数据)存储

动画文件导入设置优化后信息查看原则

  1. 一看效果差异(与原始制作动画差异是否明显)
  2. 二看曲线数量(总曲线数量与各种曲线数显,常量曲线比重大更好)
  3. 三看动画文件大小(以移动平台为例,动画文件在小几百k或更少为合理,查过1M以上的动画文件考虑是否进行了合理优化)