图像与设计
Unity 6 音频优化:降低内存/CPU 并修复 3D…
适用于 Unity 6 项目需要降低音频内存占用、减少 DSP CPU 峰值、修复 3D 声道路由或调优压缩质量时。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
Unity 6 音频优化:降低内存/CP特定
解决思路
- 先执行 `unity-cli` skill:安装 CLI、确认已连接 Editor、添加项目的 `com.unity.pipeline` 包、区分真正缺失 Editor 与 Safe Mode、发现 Editor 命令目录;不要重新推导这些。
- 确认命令目录中存在 `eval`;它取决于 Pipeline 包版本,缺失时直接说明并停止。
- 不要手工编辑 `.meta` 文件改导入设置;导入器值只能通过 live Editor 中的 `SaveAndReimport()` 生效,Editor 不可达就停止。
- 用 `unity command eval --code '<snippet>'` 运行 C#;用 `unity command --format json` 发现参数形状,不要假设;`unity command` 默认 30 秒超时。
- 传给 `eval` 的是 statement block 不是文件:不要写 `using` 指令;类型必须完全限定;裸 `AssetDatabase`/`AudioImporter` 不会解析,裸 `Object` 与 `object` 二义;直接复用 `resources/audio-import-api.md` 中已完全限定的配方。
- 修改前必须向用户报告发现;严格按步骤顺序,不跳步;每个 `WAIT` 检查点停止并等待用户回复;每次修改前后都要测量;最终必须在 device build 验证,Editor 音频统计仅供参考。
- Pre-Flight:用 `eval` 读取 `EditorUserBuildSettings.activeBuildTarget` 和 `AudioSettings.outputSampleRate`,判断平台与输出采样率是否让覆盖 clip 采样率真正省内存。
- Pre-Flight:用 `resources/audio-import-api.md` 的 mixer-asset 查询配方检测是否存在 AudioMixer;若不存在,记录无需关注路由和效果成本。
- Pre-Flight:用 `resources/audio-import-api.md` 的 scene-component 查询配方查询 `UnityEngine.AudioListener`,确认恰好一个;多个导致错误空间化,零个导致静音。
- Pre-Flight:仅在平台和 listener 状态确认后继续。
- 评估:用 scene-component 查询配方找到所有 `UnityEngine.AudioSource`;对每个结果用一次 `eval` 批量读取属性,见批量读取配方。
- 评估:若 Pre-Flight 发现 mixer,用 `eval` 读取 AudioMixer 暴露参数和 group 数量;group 数超过约 8 或 Master group 上有 effects 是立即风险。
- 评估:用 DSP buffer 配方读取 buffer size;推荐值见 `resources/platform-settings.md` 的 DSP Buffer Size Guidelines。
- 评估:在修改前向用户报告所有发现的 source、listener 数量、mixer 深度;标记风险,例如 `spatialBlend = 1` 的立体声 clip、>1 MB 的 clip 使用 Decompress On Load、Master group 上有 reverb。
- 评估后 `WAIT` 等用户审阅再继续。
- 按用户症状路由:音频内存过高/Profiler 显示音频 → Section 4 导入设置审计;加载慢/解压卡顿 → Section 4 Load Type review;DSP 峰值/mixer CPU/音频 CPU 高 → 4B;3D 声音错误/只有左声道/立体声用于 3D → 4A;质量瑕疵/人声差/Vorbis 爆音 → 4C;移动端音频电池/内存 → 4D;批量设置所有 clip → 4;streaming/后台加载/Addressables 音频 → 4E。
- 若症状不明确,先问用户:问题在于音频内存、DSP CPU 峰值,还是播放质量?
- 4A:对 `spatialBlend > 0` 的 AudioSource,用 `eval` 读取 `audioSource.clip.channels`;若 `channels == 2` 且 `spatialBlend == 1`,只有左声道播放,这是 bug。
- 4A:用 `resources/audio-import-api.md` 的 read importer 配方检查当前设置,再用 force-to-mono 配方应用 Force To Mono。
- 4A:应用并 reimport;向用户报告前后 channel 数。
- 4A:用 `eval` 确认 `audioSource.spatialBlend` 为 `1.0`(完整 3D)且 `audioSource.rolloffMode` 使用合适曲线。
- 4B:用 `eval` 遍历 mixer group tree 并统计层级;超过 3 层(Master → SFX/Music/Voice → sub-bus)即使子组静音也会每帧增加路由开销。
- 4B:用 `eval` 查询每个 group 的 effects 列表;`AudioReverbFilter` 等 effects 即使没有 AudioSource 路由到该 group 也会全成本运行 DSP。
- 4B:标记 parent group 上的 SFX Reverb;它是最贵的内置 effect,若在 Master 或高层 group 上要明确标记。
- 4B:向用户提出建议:移除或 bypass 没有活跃 source 的 group 上的 effects;用 snapshots 切换 mix states(combat/explore/pause)而不是运行时切换 effects;扁平化不必要 sub-bus,把 source 重定向到更浅的祖先。
- 4B:应用 mixer 修改前 `WAIT` 等用户批准。
- 4B:验证 DSP buffer size;若 Pre-Flight 的 `bufferLength` 很小(<256),建议增大,见 `resources/platform-settings.md` 的 DSP Buffer Size Guidelines。
- 4C:用 read importer 配方读取用户报告 clip 的 `compressionFormat` 和 `quality`。
- 4C:按 `resources/platform-settings.md` 的 Compression Format Matrix 应用逐平台建议。
- 4C:用 lossy source check 配方检查有损来源;若原文件是 MP3,警告用户 Unity 重新编码后有损来源质量会永久丢失,建议 WAV 或 AIFF 来源。
- 4D:用 `UnityEngine.AudioSource` 的 scene-component 查询配方,筛选移动端目标上的非音乐、非对白 SFX clip。
- 4D:用 read importer 配方读取每个 clip 的 `sampleRateSetting` 和 `sampleRateOverride`。
- 4D:用 sample rate override 配方应用移动端覆盖;按用途采样率见 `resources/platform-settings.md` 的 Sample Rate Recommendations。
- 4D:报告节省;采样率减半则 PCM 内存成本减半;对每个改动 clip 报告估计节省。
- 4E:用 `eval` 读取 Section 2 中每个 clip 的 `clip.loadType`。
- 4E:按 `resources/platform-settings.md` 的 Load Type Decision Table 应用决策规则。
- 4E:按 Load Type Mismatch Flags 标记不匹配;向用户报告两类不匹配。
- 4E:对任何 Streaming clip 应用 `Load In Background`,用 `resources/audio-import-api.md` 的 Load In Background 配方。
- 验证:任何导入设置或 mixer 修改后,用 `eval` 重新读取 `clip.loadType`、`clip.channels`、`AudioSettings.outputSampleRate` 和 importer 的 `compressionFormat`,确认 reimport 后生效。
- 验证:用 `UnityEngine.AudioSource` 的 scene-component 查询配方确认 mixer 重构后 `audioSource.outputAudioMixerGroup` 按预期赋值。
- 验证:报告每个改动设置的前后值;不要假设生效,必须读回已应用的 importer 值。
- 验证:最多 3 次调整-验证循环,然后暂停询问用户反馈。
- 排障(3D 立体声只左声道):确认 `audioSource.spatialBlend == 1`;确认 `audioSource.clip.channels == 2`;在 AudioClip importer 启用 `forceToMono` 并 reimport;Unity 导入时会混合两声道到 mono,保持 `normalize = true` 以保留电平。
- 排障(3D 立体声只左声道):若用户不想 reimport,可设 `audioSource.panStereo = 0` 作为运行时权宜,但警告这不能恢复立体声信息。
- 排障(Decompress On Load 内存尖峰):确认 `clip.loadType == AudioClipLoadType.DecompressOnLoad` 且 `clip.length` 较长(>5 s)。
- 排障(Decompress On Load 内存尖峰):若是音乐或环境音改为 `Streaming`,若只是偶尔播放改为 `CompressedInMemory`。
- 排障(Decompress On Load 内存尖峰):若 clip 短但仍大,检查 `clip.channels`(立体声浪费双倍内存)和 `clip.frequency`(移动端高采样率浪费内存),应用 Force To Mono 和/或 sample rate override。
- 排障(AudioMixer CPU 尖峰/DSP 线程热):用 mixer-asset 查询配方确认 mixer graph 存在。
- 排障(AudioMixer CPU 尖峰):用 `eval` 列出所有 group 及其 effects;查找高层 group 上的 reverb、chorus 或 EQ。
- 排障(AudioMixer CPU 尖峰):把昂贵 effects 下移到只有 source 播放时才活跃的 leaf group。
- 排障(AudioMixer CPU 尖峰):用 snapshots 在听不到效果的 gameplay 状态 bypass effect chain(例如菜单期间 bypass reverb)。
- 排障(AudioMixer CPU 尖峰):若 DSP buffer 很小(64 或 128 samples),提高它,见 `resources/platform-settings.md` 的 DSP Buffer Size Guidelines。
- 排障(人声 Vorbis 质量瑕疵):确认 `defaultSampleSettings.compressionFormat == AudioCompressionFormat.Vorbis`。
- 排障(人声 Vorbis 质量瑕疵):确认 `defaultSampleSettings.quality`;默认 0.5 对人声常可听出,提高到 0.7–0.85。
- 排障(人声 Vorbis 质量瑕疵):iOS 上切换到 AAC 而不是 Vorbis(硬件解码,同码率质量更好)。
- 排障(人声 Vorbis 质量瑕疵):确认源文件无损(WAV 或 AIFF);MP3 源无法恢复 Unity 重编码前已丢失的质量。
- 排障(AudioListener 数量不是恰好一个):零个 listener 会导致全静音;用 `eval` 给主相机添加组件:`UnityEngine.Camera.main.gameObject.AddComponent<UnityEngine.AudioListener>()`。
- 排障(AudioListener 数量不是恰好一个):多个 listener 时 Unity 使用最后启用的一个,空间化不可预测;用 scene-component 查询配方找到 `UnityEngine.AudioListener`,禁用除预期外的所有 listener。
- 排障(`Load In Background` 导致首次播放静音):这是预期行为,首次 `Play()` 时 clip 尚未加载完成;在场景开始时调用 `clip.LoadAudioData()` 预加载。
- 排障(`Load In Background` 导致首次播放静音):用 `AudioSource.PlayScheduled()` 配合轻微延迟等待异步加载完成。
- 排障(`Load In Background` 导致首次播放静音):对必须立即播放的 AudioSource,改用 `CompressedInMemory`(首次播放同步),而不要用带后台加载的 `Streaming`。
- 完成:总结每个改动设置的前后值。
- 完成:列出仍需要关注的 clip 或 group(例如需要真机测量才能确认节省的 clip)。
- 完成:若用户需要运行时内存测量,指向 Memory Profiler package,它按运行时字节成本报告最大的 AudioClips。
- 完成:若审计后 mixer CPU 仍高,指向 Unity Profiler 的 Audio module 做 DSP 线程 profiling。
- 详细参考:平台设置、压缩矩阵、load types、采样率见 `resources/platform-settings.md`;AudioImporter API 配方和代码模式见 `resources/audio-import-api.md`。
- 另见:Memory Profiler package 找最大 AudioClips;Unity Profiler Audio module 看 DSP CPU markers 和帧时间预算;`audio-setup-mixers` 用于创建 mixers 和把 Audio Sources 路由到 groups。
适用边界 · 注意事项
- 无可用 Unity Editor、`unity-cli` 或命令目录中没有 `eval` 时不要使用;不要通过手改 `.meta` 绕过。
- 非 Unity 或非 Unity 6 项目,或问题与音频导入/混音器无关时不要套用。
- 无法在 device build 验证,且用户不愿接受 Editor 统计仅作参考时,不要给出最终优化结论。