如何压缩您的 VRChat 模型大小
来自澎澎——一个人的努力不能完成这个篇幅较大的紧急文档,我们欢迎大家在这里分享自己的思路和惯用工具!
2024 年 7 月 16 日,VRC 将正式实行对模型大小的新限制,为应对这个改变,我们将在此文档中解释什么是模型大小,以及如何通过简单的工具/文件操作来优化它。
模型大小与 VRChat 新限制
什么是模型大小?
压缩大小 / 下载文件大小:下载时模型文件的大小。
未压缩大小 / UNCOMPRESSED SIZE:模型下载并解压缩到设备运行内存空间(RAM)后的总大小,。
显存使用量 / 显存占用:模型使用的显卡内存(VRAM)大小。有时也称为“VRAM 使用率”。(需要注意的是,当前 VRChat 的“显存占用”只统计贴图大小,不包含网格占用)
让我们举个例子:
这是 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 将提醒您的模型已超过对应限制,且会报错无法上传:
我该怎么优化自己的模型大小?
以下是为您准备的大致建议,接下来的教程章节将遵守这些指导。
1. 贴图方面
- 减少模型贴图数量和体积;
- 避免使用超过 2K 分辨率的贴图,分辨率越大,大小越大。
- 设置合适的压缩方式,降低贴图的体积。
2. 音乐方面
- 避免使用长音频文件;
- 选择压缩比高的音频格式。
3. 动画方面
- 避免添加过多的 MMD 动画;
- 避免使用完全关键帧的动画;
- 避免使用动作包;
- 降低动画曲线精度。
4. 综合方面
- 避免在一个模型内集成过多的衣服或功能,适当拆分模型。
章末
如果您已经准备好了,请阅读下一个章节。
贴图方面
压缩贴图大小是目前最简单也最容易减小您模型大小的方法。
选中一个贴图,即可在 Inspector | 检查器 中查看此贴图目前的导入设置:
让我们快速认识一下可以减少贴图大小的重要部分:
- Alpha Is Transparency | Alpha 是透明的 允许导入贴图中透明的部分,一般配合渲染模式非 Opaque/不透明 的材质球使用;
- Generate Mipmaps | 生成 Mipmap 生成一系列 Mipmap,来使得视角距离物体偏远时拥有更好的视觉效果;
- Max Size | 最大尺寸 最大贴图大小,将贴图分辨率限制在您选择的值内;
- Format | 格式 贴图导入格式,原理类似于压缩包,默认为 Automatic ,即 自动选择;
- Compression | 压缩 压缩质量,越高的质量代表着越好的视觉效果和越大的导入大小,反之亦然;
- Use Crunch Compression | 使用 Crunch 压缩 使用紧凑压缩,此功能会进一步减少贴图导入大小和画质。
注:世界上没有什么可以让高视觉效果与低导入大小同时存在的设置,这是一个取与舍的选择,取决于您。
Alpha Is Transparency / Alpha 是透明的:
如果您勾选了此选项,则可以配合着色器来做出一些不错的视觉效果,比如说半透明的刘海或衣服。如表格所示:
对应关系 | Alpha Is Transparency 关闭 | Alpha Is Transparency 打开 |
预览 |
注:由于此衣物使用的是 Alpha 蒙版制作的半透明效果,所以无法给出参考数值大小,十分抱歉。
我该在什么情况下打开或关闭它?
您可以选择关闭此选项,但意味着视觉效果会变差。
如果您的物体未包含透明的部分,您可以选择关闭它。亦或者使用 PhotoShop 将贴图透明的部分使用纯色(例如纯黑或纯白)进行填充,从根源减小贴图大小。
有些着色器(例如:liltoon)会提供使用 Alpha 蒙版 来制作透明或半透明效果的选项。遇到此情况应该去修改贴图对应的材质球设置!
Generate Mipmaps / 生成 Mipmap:
此选项用于生成一系列逐渐降低分辨率的贴图,用来在视角与物体之间选择适合当前距离的分辨率,以减少视觉效果上的撕裂或摩尔纹。如表格所示:
对应关系 |
近距离观察 Generate Mipmaps 关闭 |
Generate Mipmaps 关闭 | Generate Mipmaps 打开 |
预览 | |||
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 |
预览 | ||||
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 的官方讲解页面来进一步了解。
转到 PC 导入设置
,并勾选 Override For Windows, Mac, Linux
来调整 Format
。这里的选项会覆盖 Default 的导入设置,所以如果有需要,别忘了也调整剩余的选项。
对应关系 | DXT5|BC3 | DXT1|BC1 | DXT5|BC3 | DXT1|BC1 |
预览 | ||||
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 |
我该如何选择合适的选项?
- DXT5|BC3 :适用于 99% 的贴图,导入透明度;
- DXT1|BC1 :如果贴图不需要用到透明度,您则可以使用此格式,它与
DXT5|BC3
的区别仅在于它不导入透明度;
对于 法线 / Normal 贴图,您不应该尝试着更改它们的格式。这可能会导致意想不到的结果,请将选项保持在 Automatic。
Compression / 压缩:
此选项影响着贴图被 Max Size 选项进行压缩后的质量,越低的质量意味着越小的大小和越多的杂色和色块。如表格所示:
对应关系 | None | Low Quality | Normal Quality | High Quality |
预览 | ||||
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 |
预览 | |||||
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 原生不支持中文!如果你需要中文,请访问 此处 来获得汉化文件!
音频方面
尽管 Unity 使用的打包格式 AssetBundle 一般情况下压缩率都很高,但是对于音频这样的信息熵很高的多媒体文件,常规的无损压缩很难减小它的体积。因此,对于较长的音频文件,如果想要大幅降低体积,必须使用合适的有损压缩方式。
压缩率的计算方式为:压缩后大小 / 压缩前大小,因此压缩率越小,压缩效果越好。
Unity 支持大多数常见音频文件,并且针对各种用例提供了不同的压缩、加载方式。Unity 将音频文件称之为 Audio Clip
,而正确配置 Audio Clip 导入设置
非常重要!
取决于您的音频长度,错误的配置方式可能会严重影响你的模型大小,加载后的内存消耗以及播放时的 CPU 周期消耗!
CPU 运行指令时需要消耗 CPU 时钟周期,用掉的 CPU 周期越多,任务管理器中显示的 CPU 占用率越高。
下面是一个 .wav 文件的典型的 Audio Clip 导入设置(此处提供简体中文和英文版本作为交叉对照):
关于这些属性的详细解释,请参考 Unity 官方对于 Audio Clip 的文档。
这些属性中,最重要的是以下几个选项:
- 后台加载(Load In Background):如果加载类型(Load Type)选择
加载时解压缩(Decompress On Load)
,则 VRChat SDK 要求必须启用后台加载。 - 加载类型(Load Type):决定 Unity 对 Audio Clip 的加载行为,后文会详细解释该选项。
- 压缩格式(Compression Format):配置 Unity 打包该音频文件时使用什么格式压缩。取决于 Audio Clip 的长度及其播放频率,应该视情况设置,以均衡文件大小及 CPU 周期消耗,后文会详细解释该选项。
- 质量(Quality):当使用有损压缩格式(Vorbis,或 Android 平台时可以使用 MP3)时用于设置压缩后的音质。质量越低,压缩后的体积越小,相应的音频质量也会更低。
- 采样率设置(Sample Rate Setting):采样率越低,音频文件越小,相应的音频质量也会更低,后文会详细解释该选项。
如果决定进行 Android 平台的支持,可以类似贴图导入设置一样启用 Android 平台的覆盖设置(Override for Android),其属性基本一致,但是压缩格式额外增加了 MP3
支持。由于 Vorbis
格式解压时 CPU 周期消耗相对较高,因此如果 PC 平台使用 Vorbis
,推荐 Android 平台使用 MP3
。
至于其它属性,由于对模型体积以及性能消耗并不重要,因此这里简单介绍一下功能:
- 强制变为单声道(Force To Mono):打包时将多声道音频缩减为单声道
- 全景声:用于 360° 视频和 XR 视频等支持,一般不需要勾选
- 预加载音频数据:Unity 场景加载后会加载该 Audio Clip,但是对于模型上传而言似乎并不重要,VRChat Avatar SDK 也并没有强制要求进行设置,一般打开即可。
下面,我们将对压缩格式、采样率和加载类型两个属性进行深入的解释。
压缩格式
Unity 导入音频后将根据压缩格式将原始音频文件打包到最终的生成产物中。Unity 提供了以下几种压缩格式:
PCM
- 原始的音频数据,完全不需要任何处理可以直接被播放,体积最大,但是播放时不需要解压,CPU 周期消耗最低。
- 适用于短、播放频繁的音频类型,如脚步声、撞击声、武器声音等。
ADPCM
- 一种有损压缩格式,由 PCM 进行差分编码压缩得来,体积固定为 PCM 的 27 % ,播放时解压的 CPU 周期消耗低。
- 由于 ADPCM 的编码特性,不同音频内容的压缩效果不一,一般而言,高频率的音频内容 使用 ADPCM 的压缩质量相对较差,因此如果使用 ADPCM,因此应当始终检查 ADPCM 压缩后的音频质量。
- 适用于短、播放频繁且对音质要求不高的音频类型,如噪声,爆炸声等。
Vorbis
- 一种有损压缩格式,通常使用 Ogg 作为容器,称之为 Ogg Vorbis。压缩率优秀,体积最小,播放时解压的 CPU 周期消耗最高。
- 使用 Vorbis 时,可以修改质量(Quality)数值来平衡压缩率与体积:
- 质量越高,体积越大,音质越好;
- 质量越低,体积越小,音质越差。
- 需要注意的是,Vorbis 只能进行可变比特率编码,这意味着不同音频内容的压缩率会有所不同。
- 适用于长、播放不频繁的音频类型,如音乐、歌曲等。
*MP3
- 一种有损压缩格式,仅在 Android 平台可用,类似 Vorbis,压缩率较 Vorbis 更低,但是播放时解压的 CPU 周期消耗相对 Vorbis 较小。
- 可以作为 Android 平台上 Vorbis 的替代。
- 不支持无缝循环。
音频质量是主观的,没有固定的标准,因此对于如何选取配置压缩质量,用户需要根据音频的类型自行平衡质量与体积。当然,也可以用最低质量换取最低的文件体积,只要你能接受压缩带来的音频质量损失
正确设置压缩格式不但影响音频体积,还会影响播放时的 CPU 周期消耗:ADPCM、Vorbis 和 MP3 在播放前必须被解压为 PCM 格式才能播放。取决于加载类型,错误的压缩格式配置可能会造成高 CPU 周期消耗或者高内存消耗!加载类型造成的影响将在后文中进行解释。
采样率设置
尽管现实世界的音频是连续的模拟量,但是存储为数字格式时需要转换为离散的数据格式,这一过程被称之为“采样”。采样率这一参数就是表示了音频文件的采样,其单位为 Hz,意为“每秒进行多少次采样”。
对于采样率,Unity 提供了三个选项:
- 保持采样率(Preserve Sample Rate):使用原始音频文件的采样率
- 优化采样率(Optimize Sample Rate):让 Unity 根据音频文件内容自行设置一个合适的采样率
- 覆盖采样率(Override Sample Rate):手动设置采样率
类似压缩质量,采样率越低,体积越小,音频质量越差。
信息不能无中生有:设置为比原始音频文件更高的采样率不能提高音质,只能浪费更多的存储空间!
附录:不同压缩格式的参考压缩效果
原始音频为长度 02:26 的 WAV 文件,内容为歌曲,采样率 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)
- 使用此选项,Unity 将在加载模型时将音频解压为 PCM。这样当音频播放时不需要进行额外的解压操作,每次播放时 CPU 周期消耗最低,但是由于 PCM 体积非常大,如果音频很长,这会导致极高的内存占用。
- 适用于需要频繁播放且长度短的音频内容,如频繁触发的音效,脚步声,枪械声等。
压缩内存(Compressed In Memory)
- 使用此选项, Unity 将在加载模型时将压缩后的音频内容保持压缩状态,播放时再动态解压缩为 PCM。需要注意的是,Unity 并不会在第一次播放后将音频解压缩为 PCM 并替换掉原始的压缩的内容,而是每次播放时都要消耗 CPU 进行解压。作为好处,如果有很多的音频文件,这会极大地降低音频文件的内存占用。
- 适用于不会经常播放且长度较长的音频内容,如歌曲,舞蹈的配乐等。
流式处理(Streaming)
- 音频文件不会被读入内存,而是在播放时动态地从硬盘上读入内存,具有最低的内存占用,但有着三种加载类型中最高的 CPU 周期消耗。而且在大多数操作系统上,能同时打开的文件数量是有限的,这会限制该功能的使用。
- 对于模型而言,任何时候都不推荐使用该加载类型!
一定要根据自己的需求正确设置加载模式!不然你可能会面临高 CPU 周期消耗及高内存消耗。
总结
综上所述,对于不同类型的音频文件,建议使用以下配置:
音频类型 | 长度 | 播放频率 | 推荐压缩格式 | 推荐加载类型 |
长度短,不常播放的音频内容 |
短 |
低 |
任意 |
加载时解压缩或压缩内存 |
各种音效,如脚步声、交互声音 | 短 | 高 | 任意 |
加载时解压缩 |
质量需求低的音效,如爆炸、噪声 | 短 | 高 | ADPCM 或任意 |
加载时解压缩 |
质量要求高,长度很长的音乐 | 长 | 低 | Vorbis(或 Android 平台使用 MP3) | 压缩内存 |
质量要求低,长且频繁播放的音频内容 | 长 | 高 | ADPCM | 压缩内存 |
除此以外,还应当根据具体的需求调整 Vorbis (或 MP3)的压缩质量以及采样率,以求在大小和质量中找到一个平衡点。
当然,最重要的降低模型体积提高性能的方式仍然是:
- 不要添加太多音频文件
- 如果真的需要这么多音频文件,拆分为多个模型上传