Unity 提供了两种压缩网格的方法。它们的工作原理不同,对性能的影响也各有不同:
要访问网格压缩设置,请打开模型导入设置 (Model Import settings) 窗口,导航到模型 (Model) 选项卡的网格 (Meshes) 部分,然后使用网格压缩 (Mesh Compression) 下拉选单。
在同一个项目中可以同时使用这两种方法,但不能对同一个网格同时应用。如果将网格压缩应用于网格,Unity 不会将顶点压缩应用于该网格。
注意:Unity 中顶点压缩和网格压缩的默认设置适用于大多数项目。只有在出现问题时才应更改这些设置,并且要评估更改后的结果,确保这些更改起到了积极作用。
顶点压缩 (Vertex Compression) 设置允许为项目中的所有网格使用较低精度的数据格式。为此,您需要为特定数据通道配置数据类型。
您可以将给定通道的数据类型从 FP32(32 位浮点数,一种 32 比特的浮点数)更改为 FP16(16 位浮点数,也称为半精度浮点数 )。FP16 格式存储的数字在小数点后位数少于 FP32 数字,这意味着它占用更少的空间,但提供的精度稍低。
从 FP32 转换到 FP16 的数据在内存中占用的空间较小,在磁盘上占用的空间稍微较小。在 GPU 上,数据使用更少的内存带宽,这可能略微提升 GPU 性能。
顶点压缩技术对网格的压缩比例取决于选择压缩的顶点属性数量。压缩法线、切线、颜色和三组 UV 坐标时,压缩比通常约为 1.45 倍。
您可以使用网格压缩 (Mesh Compression) 设置来压缩磁盘上给定模型资源的网格数据。网格压缩算法比顶点压缩技术更具攻击性,因此会产生更高的压缩比,从而减小文件大小。但是,它也有更多的缺点。
应用此设置时,Unity 使用一种算法,用最大值和最小值之间的范围来替换每个压缩通道的显式值,并用固定位数表示每个值在该范围内的位置。此做法可减小磁盘上网格数据的大小。Unity 将网格加载到内存中时,它会解压缩数据,这意味着它会将此范围转换回原始值。此后,性能不受影响。
如果需要尽可能减小最终构建大小或网格所在的 AssetBundle 大小,且运行时解压缩导致的性能下降在可接受范围内,则此方法非常有用。
在运行时,网格解压缩会使用额外的 CPU 资源;这意味着加载网格数据需要更长的时间。Unity 在解压缩网格时还会使用更多临时内存。
此外,相对较高的压缩比意味着 Unity 解压缩网格时可能会出现不必要的瑕疵。为了避免这些瑕疵,需要测试要压缩的网格的每个选项,并检查其是否显示正确。