如何压缩您的 VRChat 模型大小

来自澎澎——一个人的努力不能完成这个篇幅较大的紧急文档,我们欢迎大家在这里分享自己的思路和惯用工具!

2024 年 7 月 16 日,VRC 将正式实行对模型大小的新限制,为应对这个改变,我们将在此文档中解释什么是模型大小,以及如何通过简单的工具/文件操作来优化它。

模型大小与 VRChat 新限制

什么是模型大小?

压缩大小 / 下载文件大小:下载时模型文件的大小。

未压缩大小 / UNCOMPRESSED SIZE:模型下载并解压缩到设备运行内存空间(RAM)后的总大小,。

显存使用量 / 显存占用:模型使用的显卡内存(VRAM)大小。有时也称为“VRAM 使用率”。(需要注意的是,当前 VRChat 的“显存占用”只统计贴图大小,不包含网格占用)

让我们举个例子:

image.png这是 VRChat 内的模型详情页面,其中 UNCOMPRESSED SIZE 指解压文件大小,下载文件大小指模型文件大小,显存占用即显存使用量;

您可以通过一些方法或插件(如 thry,lilAvatarUtils 等等)来在 Unity 内查看自己模型的大小。

新模型大小标准是?

VRChat 官方发布了一个模型大小标准对比的表格数据,如下:

PC 最大指标 7 月 16 日前 7 月 16 日后 涨跌幅
未压缩大小(RAM 使用率) 1200兆字节(MB) 500兆字节(MB) -41.6%
压缩大小(下载大小) 500兆字节(MB) 200兆字节(MB) -40%

对于 Quest (Android) 模型,指标并未改变,您无需担心;最大压缩大小仍为 10 MB,最大未压缩大小仍为 40 MB。

如果您的模型指标不合以上限制,那么之后新 SDK 将阻止您上传新模型,示例界面如下

当您的模型未压缩大小违规时,SDK 将提醒您的模型已超过对应限制,且会报错无法上传:

avatarfilesize_sdk1
avatarfilesize_sdk3

我该怎么优化自己的模型大小?

以下是为您准备的大致建议,接下来的教程章节将遵守这些指导。

1. 贴图方面

2. 音乐方面

3. 动画方面

4. 综合方面

章末

如果您已经准备好了,请阅读下一个章节。

贴图方面

压缩贴图大小是目前最简单也最容易减小您模型大小的方法。

选中一个贴图,即可在 Inspector | 检查器 中查看此贴图目前的导入设置:

贴图导入设置.png

让我们快速认识一下可以减少贴图大小的重要部分:

注:世界上没有什么可以让高视觉效果与低导入大小同时存在的设置,这是一个取与舍的选择,取决于您。

Alpha Is Transparency / Alpha 是透明的:

如果您勾选了此选项,则可以配合着色器来做出一些不错的视觉效果,比如说半透明的刘海或衣服。如表格所示:

对应关系 Alpha Is Transparency 关闭 Alpha Is Transparency 打开
预览 Alpha Is Transparency OFF Alpha Is Transparency ON

注:由于此衣物使用的是 Alpha 蒙版制作的半透明效果,所以无法给出参考数值大小,十分抱歉。

我该在什么情况下打开或关闭它?

您可以选择关闭此选项,但意味着视觉效果会变差。

如果您的物体未包含透明的部分,您可以选择关闭它。亦或者使用 PhotoShop 将贴图透明的部分使用纯色(例如纯黑或纯白)进行填充,从根源减小贴图大小。

有些着色器(例如:liltoon)会提供使用 Alpha 蒙版 来制作透明或半透明效果的选项。遇到此情况应该去修改贴图对应的材质球设置!

Generate Mipmaps / 生成 Mipmap:

此选项用于生成一系列逐渐降低分辨率的贴图,用来在视角与物体之间选择适合当前距离的分辨率,以减少视觉效果上的撕裂或摩尔纹。如表格所示:

对应关系

近距离观察

Generate Mipmaps 关闭

Generate Mipmaps 关闭 Generate Mipmaps 打开
预览 MipMap_Idle MipMap_OFF MipMap_ON

Compression

Normal Quality Normal Quality Normal Quality
原始大小 75.0 MB 75.0 MB 75.0 MB
导入大小 7.1 MB 7.1 MB 9.5 MB

注:因为笔者在模型素材中找不到合适的例子,所以用世界来代替。

我该在什么情况下打开或关闭它?

如果贴图的纹理很复杂,例如牛仔裤上的编制花纹,您可能需要保持开启此选项。

如果贴图没有复杂的纹理或者渐变,您可以选择关闭此选项。

不在意模型的远处视觉效果时可以关闭此选项。

Max Size / 最大尺寸:

此选项影响到贴图最终的导入分辨率,如果你有一个分辨率为 4096 的贴图,然后将 Max Size 设置为 2048,那么最终将会以 2048 的分辨率来导入,如果原始分辨率小于你选择的 Max Size,则会按照原始分辨率进行导入。此选项影响着 90% 的视觉效果。如表格所示:

对应关系 4096 2048 1024 512
预览 4096_normal 2048_normal 1024_normal 512_normal

Compression

Normal Quality Normal Quality Normal Quality Normal Quality
原始大小 7.8 MB 7.8 MB 7.8 MB 7.8 MB
压缩大小 8.0 MB 2.0 MB 0.5 MB 128.0 KB

我该如何选择合适的选项?

这里有一个基础的建议分辨率表格,您可以按照实际效果增加或降低分辨率:

对应关系 主色 / Albedo 法线 / Normal 材质捕捉 / MatCap 各种 Mask
128


256

512

1024

2048


4096



Format / 格式

您可以指定贴图的导入格式来进一步节省空间。贴图格式可以笼统的解释为和 压缩包格式(*.rar*.zip*.7z) 一样的原理,但是可以被显卡直接读取和使用,无需解压缩并节省显存空间。每个贴图都有适合自己的导入格式,如果您感兴趣可以访问 Unity 的官方讲解页面来进一步了解。

image.png

转到 PC 导入设置,并勾选 Override For Windows, Mac, Linux 来调整 Format。这里的选项会覆盖 Default 的导入设置,所以如果有需要,别忘了也调整剩余的选项。

对应关系 DXT5|BC3 DXT1|BC1 DXT5|BC3 DXT1|BC1
预览

image.png

image.png

image.png

image.png

Compression Normal Quality Normal Quality Normal Quality Normal Quality
Alpha Is Transparency
原始大小 4.2 MB 4.2 MB 4.2 MB 4.2 MB
导入大小 4.0 MB 2.0 MB 4.0 MB 2.0 MB

我该如何选择合适的选项?

对于 法线 / Normal 贴图,您不应该尝试着更改它们的格式。这可能会导致意想不到的结果,请将选项保持在 Automatic

Compression / 压缩:

此选项影响着贴图被 Max Size 选项进行压缩后的质量,越低的质量意味着越小的大小和越多的杂色和色块。如表格所示:

对应关系 None Low Quality Normal Quality High Quality
预览 2048_None 2048_Low 2048_Normal 2048_High
Max Size 2048 2048 2048 2048
原始大小 4.9 MB 4.9 MB 4.9 MB 4.9 MB
压缩大小 12.0 MB 2.0 MB 2.0 MB 4.0 MB

我该如何选择合适的选项?

如果 Max Size 设为了 4090 或更高,调整此选项不会有较明显的效果。默认情况下选择“Normal Quality”即可。您也可以尝试选择“Low Quality”来进一步压缩。请注意,“None”选项代表着完全不进行压缩,这将带来比原图更高的大小!

如果您使用的是中文界面的 Unity,“Normal Quality”将会被显示为“法线质量”,这是翻译上的错误,正确翻译为“普通质量”,并非真的按照法线的质量进行压缩!

Use Crunch Compression / 使用 Crunch 压缩:

此选项会以非常夸张的比例来压缩您的贴图。当您勾选了此选项后,将会在下方添加一个拖动滑块,用来设置压缩质量,同时也会降低视觉效果,如表格所示:

对应关系 关闭 25 50 75 100
预览 Crunch_OFF Crunch_25 Crunch_50 Crunch_75 Crunch_100
Compression Normal Quality Normal Quality Normal Quality Normal Quality Normal Quality
原始大小 4.9 MB 4.9 MB 4.9 MB 4.9 MB 4.9 MB
导入大小 8.0 MB 0.7 MB 0.8 MB 0.8 MB 0.9 MB

我该在什么情况下打开或关闭它?

事实上,在任何情况下您都应该避免使用它!此选项只会减小模型的 压缩大小/下载文件大小,而不会减小 显存使用量/显存占用,并且会增加您的 CPU 负担!

关于此选项,你可以点击 此处 来查看 VRChat 官方的看法。

使用 lilAvatarUtils 来批量设置贴图导入设置:

如果您觉得一个个寻找模型上使用的贴图并修改导入设置很繁琐的话,您可以尝试使用 lilAvatarUtils 来批量调整贴图导入设置。lilAvatarUtils 是由 liltoon 作者 lilxyzw 开发的模型优化插件,如果您感兴趣,访问它的 Github 页面来进一步了解 lilAvatarUtils:https://github.com/lilxyzw/lilAvatarUtils。您也可以点击 这里 来前往 夜嵐蝶 Alma 编写的 lilAvatarUtils 使用说明书。

lilAvatarUtils_zh-cn

注意:lilAvatarUtils 原生不支持中文!如果你需要中文,请访问 此处 来获得汉化文件!

音频方面

尽管 Unity 使用的打包格式 AssetBundle 一般情况下压缩率都很高,但是对于音频这样的信息熵很高的多媒体文件,常规的无损压缩很难减小它的体积。因此,对于较长的音频文件,如果想要大幅降低体积,必须使用合适的有损压缩方式。

压缩率的计算方式为:压缩后大小 / 压缩前大小,因此压缩率越小,压缩效果越好。

Unity 支持大多数常见音频文件,并且针对各种用例提供了不同的压缩、加载方式。Unity 将音频文件称之为 Audio Clip,而正确配置 Audio Clip 导入设置 非常重要!

取决于您的音频长度,错误的配置方式可能会严重影响你的模型大小,加载后的内存消耗以及播放时的 CPU 周期消耗

CPU 运行指令时需要消耗 CPU 时钟周期,用掉的 CPU 周期越多,任务管理器中显示的 CPU 占用率越高。

下面是一个 .wav 文件的典型的 Audio Clip 导入设置(此处提供简体中文和英文版本作为交叉对照):

图片.png图片.png

关于这些属性的详细解释,请参考 Unity 官方对于 Audio Clip 的文档

这些属性中,最重要的是以下几个选项:

如果决定进行 Android 平台的支持,可以类似贴图导入设置一样启用 Android 平台的覆盖设置(Override for Android),其属性基本一致,但是压缩格式额外增加了 MP3支持。由于 Vorbis 格式解压时 CPU 周期消耗相对较高,因此如果 PC 平台使用 Vorbis,推荐 Android 平台使用 MP3

至于其它属性,由于对模型体积以及性能消耗并不重要,因此这里简单介绍一下功能:

下面,我们将对压缩格式采样率加载类型两个属性进行深入的解释。


压缩格式

Unity 导入音频后将根据压缩格式将原始音频文件打包到最终的生成产物中。Unity 提供了以下几种压缩格式:

PCM
ADPCM
Vorbis
*MP3

音频质量是主观的,没有固定的标准,因此对于如何选取配置压缩质量,用户需要根据音频的类型自行平衡质量与体积。当然,也可以用最低质量换取最低的文件体积,只要你能接受压缩带来的音频质量损失

正确设置压缩格式不但影响音频体积,还会影响播放时的 CPU 周期消耗:ADPCM、Vorbis 和 MP3 在播放前必须被解压为 PCM 格式才能播放。取决于加载类型,错误的压缩格式配置可能会造成高 CPU 周期消耗或者高内存消耗!加载类型造成的影响将在后文中进行解释。

采样率设置

尽管现实世界的音频是连续的模拟量,但是存储为数字格式时需要转换为离散的数据格式,这一过程被称之为“采样”。采样率这一参数就是表示了音频文件的采样,其单位为 Hz,意为“每秒进行多少次采样”。

对于采样率,Unity 提供了三个选项:

类似压缩质量,采样率越低,体积越小,音频质量越差。

信息不能无中生有:设置为比原始音频文件更高的采样率不能提高音质,只能浪费更多的存储空间!


附录:不同压缩格式的参考压缩效果

原始音频为长度 02:26WAV 文件,内容为歌曲,采样率 48000 Hz,体积 26.8 MB

采样率只列出了部分情况;不包含 MP3 相关的数据。

由于 Vorbis 为可变比特率,因此不同音频内容的压缩率会有所不同,表格数值仅供参考

压缩格式
品质
采样率(Hz)
文件大小(MB)
PCM
N/A
48,000
26.8
ADPCM N/A 48,000 7.5

Vorbis

100
48,000 7.2
Vorbis 50
48,000 2.8
Vorbis 1
48,000 1.3
PCM N/A 22,050
12.3
ADPCM N/A 22,050 3.5
Vorbis 100
22,050 3.0
Vorbis 50
22,050 1.6
Vorbis 1
22,050 0.7

加载类型

压缩格式和采样率只影响文件体积和解码时的 CPU 周期消耗,加载类型决定了如何加载这些处理后的音频文件。尽管上文中已经解释了如何降低音频文件体积,但是仍然需要根据需求正确设置加载类型。

为什么需要正确设置加载类型?因为音频压缩不同于前一篇文章中提到的贴图格式压缩,显卡能够直接使用压缩后的贴图,音频必须在内存中被解压回 PCM 才能被播放。解压过程不但需要消耗 CPU 周期,还需要占用内存

由于音频压缩一般具有极低的压缩率,参考上文中的表格,质量为 1 的 Vorbis 在 48,000Hz 采样率下具有恐怖的 4.85% 压缩率,如果有大量低压缩比的音频文件被解压进内存,这会导致看似小体积的音频文件产生极高的内存消耗!在该情况下,上文中提到的 4.85% 压缩率的音频文件会在解压后从 1.3MB 膨胀 20.6 倍变为 26.8MB

音频文件解压为 PCM 后的体积不算在模型性能限制中的“未压缩大小”,未压缩大小只计算 AssetBundle 解压后大小。

除了可能的内存消耗,解压过程中消耗的 CPU 周期也不能被简单忽略。对于频繁播放的音效(例如脚步声等),如果使用高压缩率格式,如果每次播放都要进行解压,这会消耗大量的 CPU 周期,拖慢程序性能。

为了适应不同场景的需求,Unity 提供了如下几个加载类型:

加载时解压缩(Decompress On Load)
 压缩内存(Compressed In Memory)
流式处理(Streaming)

一定要根据自己的需求正确设置加载模式!不然你可能会面临高 CPU 周期消耗高内存消耗


总结

综上所述,对于不同类型的音频文件,建议使用以下配置:

音频类型 长度 播放频率 推荐压缩格式 推荐加载类型
长度短,不常播放的音频内容


任意

加载时解压缩或压缩内存

各种音效,如脚步声、交互声音 任意

加载时解压缩

质量需求低的音效,如爆炸、噪声 ADPCM 或任意

加载时解压缩

质量要求高,长度很长的音乐 Vorbis(或 Android 平台使用 MP3) 压缩内存
质量要求低,长且频繁播放的音频内容 ADPCM 压缩内存

除此以外,还应当根据具体的需求调整 Vorbis (或 MP3)的压缩质量以及采样率,以求在大小和质量中找到一个平衡点

当然,最重要的降低模型体积提高性能的方式仍然是: