UPL10-1——音频资源优化

前置知识:U1L14——音效系统相关

音频优化的核心理念

按需加载,及时卸载
我们要尽量减少不必要的 AudioClip 在内存中驻留的 时间 和 大小
要尽量最小化活动音频的数量

音频加载方式优化

音频文件导入后非常重要的两个设置参数就是 Load Type (加载类型) 和 Preload Audio Data (预加载音频数据)

音频文件设置参数可见:U1L14-1——音效文件导入

首先来看 Preload Audio Data (预加载音频数据)

image

勾选后,当 AudioClip​ 资源被加载时(场景加载、Resources.Load​、AB包、Addressables 加载等),立即加载音频数据
取消勾选,音频数据延迟加载,直到第一次需要播放时才加载

再来看 Load Type (加载类型) 中的三种模式:

image

  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(加载时解压)+ 勾选预加载 (Decompress On Load)

      比如游戏中的枪声、脚步声、换弹声、UI 音效等

    • 低频播放: Compressed In Memory(在内存中压缩)+ 不勾选预加载 (Decompress On Load)

      比如角色受伤语音等

  2. 中等音频 (5 秒 - 2 分钟)

    • 需要快速启动:Compressed In Memory(在内存中压缩) + 勾选预加载 (Decompress On Load)

      比如重要 NPC 对话语音等

    • 内存敏感不需要快速启动:Compressed In Memory(在内存中压缩) + 不勾选预加载 (Decompress On Load)

      比如风声、雨声等环境声

  3. 长音频 (> 2 分钟)

    • Streaming(流式加载) + 不勾选预加载 (Decompress On Load)

      比如背景音乐

  • 频繁播放:优先考虑 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 甚至 11 kHz,
    文件大小和内存占用会减半或更多,同时完全满足清晰度要求

  3. 勾选 Load In Background(后台加载)

    勾选后,音频加载不会阻塞主线程,对于大文件,强烈建议勾选,避免游戏卡顿

  4. 选择适合对应平台的 Compression Format(压缩格式)

    • Andorid 和 PC 推荐勾选 Vorbis(沃比斯)
    • IOS 推荐勾选 MPEG(即MP3)
  5. 对于不需要多声道效果的音效,建议勾选 Force To Mono(多声道转单声道)

    这样可以有效减少内存占用

生命周期管理

  1. 推荐使用 AB 包或者 Addressables 管理音频文件

    相对 Resources 加载来说可以更精准的控制音效的加载和卸载,避免内存泄漏

  2. 对于频繁播放和停止的同一音效,为了避免反复实例化和销毁音频组件

    我们可以使用对象池来管理 AudioSource 组件,避免频繁产生垃圾,触发 GC

  3. 可以在音效管理中加入并发数量限制

    即当前全局音效播放数超过了上限后,限制活动源

  4. 场景切换时要注意确保清理未使用的音频资源

  5. 可以结合性能检测窗口 Profiler 检测音频模块的问题