106.内存优化-资源优化-音频
106.1 知识点
音频优化的核心理念
按需加载,及时卸载。 要尽量减少不必要的 AudioClip 在内存中驻留的时间和大小,要尽量最小化活动音频的数量。
音频加载方式优化
音频文件导入后非常重要的两个设置参数就是 Load Type(加载类型)和 Preload Audio Data(预加载音频数据)。

Preload Audio Data(预加载音频数据)
- 勾选: 当 AudioClip 资源被加载时(场景加载、Resources.Load、AB 包、Addressables 加载等),立即加载音频数据
- 取消勾选: 音频数据延迟加载,直到第一次需要播放时才加载
Load Type(加载类型)三种模式
1. Decompress On Load(加载时解压)
工作机制:
- 加载时: 音频文件完全加载到内存,并立即解压成原始的 PCM 格式
- 播放时: 直接从内存中读取已解压的 PCM 数据,无需任何额外处理
内存与 CPU 特点:
| 指标 | 表现 |
|---|---|
| 内存占用 | 最高(存储完整的解压后数据) |
| CPU 占用 | 最低(播放时零解压开销) |
| 加载延迟 | 高(需要完成解压才能使用) |
适用场景:短小、频繁播放的音效(枪声、按钮点击、跳跃声等),需要极低播放延迟和零 CPU 开销的场景。
推荐配合 Preload Audio Data 勾选。场景加载时立即解压,播放时零延迟。
2. Compressed In Memory(在内存中压缩)
工作机制:
- 加载时: 压缩的音频数据(.ogg、.mp3 等)加载到内存,保持压缩状态
- 播放时: 实时解压小块的压缩数据供播放使用
内存与 CPU 特点:
| 指标 | 表现 |
|---|---|
| 内存占用 | 中等(存储压缩数据) |
| CPU 占用 | 高(播放时持续解压) |
| 加载延迟 | 中等(只需加载压缩数据) |
适用场景:中等长度音频(角色语音、环境音效,5 秒 ~ 2 分钟),需要快速启动但内存敏感的场景。
配合 Preload Audio Data:勾选时立即加载压缩数据,首次播放无延迟;不勾选时延迟加载,节省初始内存,首次播放有轻微延迟。
3. Streaming(流式加载)
工作机制:
- 加载时: 只加载音频文件的头部信息
- 播放时: 从磁盘实时读取小块数据到固定大小的环形缓冲区
内存与 CPU 特点:
| 指标 | 表现 |
|---|---|
| 内存占用 | 最低(固定大小缓冲区,通常 256KB 左右) |
| CPU 占用 | 最高(持续磁盘 I/O + 解压) |
| 加载延迟 | 低(几乎立即可以开始播放) |
适用场景:长音频文件(背景音乐、过场动画音频,> 2 分钟),内存极度敏感的应用。
推荐不勾选 Preload Audio Data,避免无意义的预加载,按需流式读取。
总结:按音频长度选择加载方式
| 音频长度 | 播放频率/场景 | 加载方式 | 预加载 | 典型例子 |
|---|---|---|---|---|
| 短音频 (< 5 秒) | 高频播放 | Decompress On Load | 勾选 | 枪声、脚步声、换弹声、UI 音效 |
| 短音频 (< 5 秒) | 低频播放 | Compressed In Memory | 不勾选 | 角色受伤语音 |
| 中等音频 (5 秒 ~ 2 分钟) | 需要快速启动 | Compressed In Memory | 勾选 | 重要 NPC 对话语音 |
| 中等音频 (5 秒 ~ 2 分钟) | 内存敏感 | Compressed In Memory | 不勾选 | 风声、雨声等环境声 |
| 长音频 (> 2 分钟) | — | Streaming | 不勾选 | 背景音乐 |
- 频繁播放:优先考虑 CPU 开销,选择 Decompress On Load
- 内存敏感:优先考虑 Compressed In Memory 或 Streaming
音频格式与设置优化
音效格式
不建议直接在项目中使用 WAV、AIFF 等音频格式,这些格式的内存占用很大。推荐使用:
- mp3: 适用于有较长静音或复杂音轨的音乐(如背景音乐),压缩率高
- ogg: 通常比 MP3 有更好的压缩比和质量,是 BGM 和长音效的绝佳选择
- aac: 在 iOS 平台上有硬件解码支持,效率很高
对于移动平台来说,iOS 优先使用 mp3 或 aac 格式,Android 优先使用 ogg 格式。
设置优化
1. 降低质量
对于背景音乐或非核心音效,适当降低音频设置中的质量选项可以显著减少文件大小和内存占用,而人耳几乎听不出太大区别。
| 质量范围 | 适用场景 |
|---|---|
| 高质量(0.8 ~ 1.0) | 音乐、重要音效 |
| 中等质量(0.5 ~ 0.7) | 环境音、次要音效 |
| 低质量(0.3 ~ 0.5) | 测试阶段或内存极度紧张时 |
2. 降低采样率(制作音频文件时设置)
语音频率范围远小于音乐,对于语音文件,将采样率从 44.1kHz 降低到 22.05kHz 甚至 11kHz,文件大小和内存占用会减半或更多,同时完全满足清晰度要求。
3. 勾选 Load In Background(后台加载)
勾选后,音频加载不会阻塞主线程。对于大文件,强烈建议勾选,避免游戏卡顿。
4. 选择适合对应平台的 Compression Format(压缩格式)
- Android 和 PC 推荐勾选
Vorbis - iOS 推荐勾选
MPEG(即 MP3)
5. 勾选 Force To Mono(多声道转单声道)
对于不需要多声道效果的音效,建议勾选,这样可以有效减少内存占用。
生命周期管理
- 推荐使用 AB 包或者 Addressables 管理音频文件 — 相对 Resources 加载来说可以更精准的控制音效的加载和卸载,避免内存泄漏
- 使用对象池管理 AudioSource 组件 — 对于频繁播放和停止的同一音效,为了避免反复实例化和销毁音频组件,可以使用对象池来管理,避免频繁产生垃圾触发 GC
- 加入并发数量限制 — 当前全局音效播放数超过了上限后,限制活动源
- 场景切换时清理资源 — 确保清理未使用的音频资源
- 结合 Profiler 检测 — 可以结合性能检测窗口 Profiler 检测音频模块的问题
106.2 知识点代码
Lesson106_内存优化_资源优化_音频.cs
public class Lesson106_内存优化_资源优化_音频
{
#region 知识点一 音频优化的核心理念
// 按需加载,及时卸载
// 我们要尽量减少不必要的 AudioClip 在内存中驻留的时间和大小
// 要尽量最小化活动音频的数量
#endregion
#region 知识点二 音频加载方式优化
// 音频文件导入后非常重要的两个设置参数就是
// Load Type(加载类型)和 Preload Audio Data(预加载音频数据)
// 首先来看
// Preload Audio Data(预加载音频数据)
// 勾选后
// 当 AudioClip 资源被加载时(场景加载、Resources.Load、AB 包、Addressables 加载等)
// 立即加载音频数据
// 取消勾选
// 音频数据延迟加载,直到第一次需要播放时才加载
// 再来看
// Load Type(加载类型)中的三种模式:
// 1. Decompress On Load(加载时解压)
// 工作机制:
// 加载时:音频文件完全加载到内存,并立即解压成原始的 PCM 格式
// 播放时:直接从内存中读取已解压的 PCM 数据,无需任何额外处理
// 内存与 CPU 特点:
// 内存占用:最高(存储完整的解压后数据)
// CPU 占用:最低(播放时零解压开销)
// 加载延迟:高(需要完成解压才能使用)
// 适用场景:
// 短小、频繁播放的音效(枪声、按钮点击、跳跃声等)
// 需要极低播放延迟和零 CPU 开销的场景
// 推荐配合 Preload Audio Data(预加载音频数据)
// 适用:短小高频音效
// 效果:场景加载时立即解压,播放时零延迟
// 2. Compressed In Memory(在内存中压缩)
// 工作机制:
// 加载时:压缩的音频数据(.ogg、.mp3 等)加载到内存,保持压缩状态
// 播放时:实时解压小块的压缩数据供播放使用
// 内存与 CPU 特点:
// 内存占用:中等(存储压缩数据)
// CPU 占用:高(播放时持续解压)
// 加载延迟:中等(只需加载压缩数据)
// 适用场景:
// 中等长度音频(角色语音、环境音效,5 秒 - 2 分钟)
// 需要快速启动但内存敏感的场景
// 配合 Preload Audio Data(预加载音频数据)
// 适用:重要的语音/音效,需要快速首次播放
// 效果:立即加载压缩数据,首次播放无延迟
// 如果不开启,会延迟加载,节省初始内存,首次播放有轻微延迟
// 3. Streaming(流式加载)
// 工作机制:
// 加载时:只加载音频文件的头部信息
// 播放时:从磁盘实时读取小块数据到固定大小的环形缓冲区
// 内存与 CPU 特点:
// 内存占用:最低(固定大小缓冲区,通常 256KB 左右)
// CPU 占用:最高(持续磁盘 I/O + 解压)
// 加载延迟:低(几乎立即可以开始播放)
// 适用场景:
// 长音频文件(背景音乐、过场动画音频,> 2 分钟)
// 内存极度敏感的应用
// 推荐不配合 Preload Audio Data(预加载音频数据)
// 适用:所有流式音频(BGM 等)
// 效果:避免无意义的预加载,按需流式读取
// 总结
// 根据音频长度来判断使用哪种加载方式和是否开启预加载
// 1. 短音频 (< 5 秒)
// 高频播放:Decompress On Load(加载时解压)+ 勾选预加载
// 比如游戏中的枪声、脚步声、换弹声、UI 音效等
// 低频播放:Compressed In Memory(在内存中压缩)+ 不勾选预加载
// 比如角色受伤语音等
// 2. 中等音频 (5 秒 - 2 分钟)
// 需要快速启动:Compressed In Memory(在内存中压缩)+ 勾选预加载
// 比如重要 NPC 对话语音等
// 内存敏感不需要快速启动:Compressed In Memory(在内存中压缩)+ 不勾选 Preload
// 比如风声、雨声等环境声
// 3. 长音频 (> 2 分钟)
// Streaming(流式加载)+ 不勾选 Preload
// 比如背景音乐
// 频繁播放:优先考虑 CPU 开销,选择 Decompress On Load
// 内存敏感:优先考虑 Compressed In Memory 或 Streaming
#endregion
#region 知识点三 音频格式与设置优化
// 音效格式:
// 不建议直接在项目中使用 WAV、AIFF 等音频格式
// 这些格式的内存占用很大
// 推荐使用
// mp3:适用于有较长静音或复杂音轨的音乐(如背景音乐),压缩率高
// ogg:通常比 MP3 有更好的压缩比和质量,是 BGM 和长音效的绝佳选择
// aac:在 iOS 平台上有硬件解码支持,效率很高
// 等格式
// 对于移动平台来说,iOS 优先使用 mp3 或 aac 格式,Android 优先使用 ogg 格式
// 设置优化
// 1. 降低质量
// 对于背景音乐或非核心音效,适当降低音频设置中的质量选项可以显著减少文件大小和内存占用
// 而人耳几乎听不出太大区别
// 高质量(0.8-1.0):用于音乐、重要音效
// 中等质量(0.5-0.7):用于环境音、次要音效
// 低质量(0.3-0.5):用于测试阶段或内存极度紧张时
// 2. 降低采样率(制作音频文件时设置)
// 语音频率范围远小于音乐,对于语音文件,将采样率从 44.1kHz 降低到 22.05kHz 甚至 11kHz
// 文件大小和内存占用会减半或更多,同时完全满足清晰度要求
// 3. 勾选 Load In Background(后台加载)
// 勾选后,音频加载不会阻塞主线程,对于大文件,强烈建议勾选,避免游戏卡顿
// 4. 选择适合对应平台的 Compression Format(压缩格式)
// Android 和 PC 推荐勾选 Vorbis
// iOS 推荐勾选 MPEG(即 MP3)
// 5. 对于不需要多声道效果的音效,建议勾选 Force To Mono(多声道转单声道)
// 这样可以有效减少内存占用
#endregion
#region 知识点四 生命周期管理
// 1. 推荐使用 AB 包或者 Addressables 管理音频文件
// 相对 Resources 加载来说可以更精准的控制音效的加载和卸载,避免内存泄漏
// 2. 对于频繁播放和停止的同一音效,为了避免反复实例化和销毁音频组件
// 我们可以使用对象池来管理 AudioSource 组件,避免频繁产生垃圾,触发 GC
// 3. 可以在音效管理中加入并发数量限制
// 即当前全局音效播放数超过了上限后,限制活动源
// 4. 场景切换时要注意确保清理未使用的音频资源
// 5. 可以结合性能检测窗口 Profiler 检测音频模块的问题
#endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com