106.音频资源优化

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(多声道转单声道)

对于不需要多声道效果的音效,建议勾选,这样可以有效减少内存占用。

生命周期管理

  1. 推荐使用 AB 包或者 Addressables 管理音频文件 — 相对 Resources 加载来说可以更精准的控制音效的加载和卸载,避免内存泄漏
  2. 使用对象池管理 AudioSource 组件 — 对于频繁播放和停止的同一音效,为了避免反复实例化和销毁音频组件,可以使用对象池来管理,避免频繁产生垃圾触发 GC
  3. 加入并发数量限制 — 当前全局音效播放数超过了上限后,限制活动源
  4. 场景切换时清理资源 — 确保清理未使用的音频资源
  5. 结合 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

×

喜欢就点赞,疼爱就打赏