最近在工作中帮助项目进行音频相关的包体容量和内存用量上的优化,我在过往的工作中其实较少接触音频相关的工作,所以这段时间也算是学到了很多之前不够了解的新知识,在这里把这段时间的工作和心得写下来权做笔记。

目前项目中的音频模块功能使用了著名的第三方音频SDK组件Wwise。比起常见引擎比如Unity、Unreal内建的音频功能,Wwise的功能还是相当强大的,提供了包括混响、渐变过渡、动态变频等功能,音频设计师甚至还可以在不需要程序员的帮助下直接在Wwise中完成很多诸如条件、随机的逻辑操作。而且Wwise提供了功能强大的Profile工具来放便开发人员监控音频模块的使用情况。不仅仅给予了音频设计师极大的发挥空间,也让程序员更容易了解音频模块的资源使用情况。如果项目的规模、预算较大,确实可以考虑集成Wwise来提高开发效率。

容量计算公式

音频资源在容量上的性质比起美术资源,比如贴图会显得更加线性且易于计算。其计算方法不仅仅适用于游戏音频的开发与制作,而是适用于整个数字音乐领域,数字音乐资源体积大小取决于四个要素:

  • 采样率:也就Sample rate,以赫兹Hz为单位,指的是每秒钟记录声音变化的次数,越高则声音的听上去越自然流畅,通常CD音乐的标准是44100Hz,而高于48000Hz的声音因人耳朵的生理极限通常被认为是不必要的。要注意的是虽然同样是以Hz作为单位,采样率与我们常说人耳能听到的低高音范围(频谱响应)并不是一回事儿。
  • 位深:位深指的是每一次采样时用来记录声音变化所使用的位宽,通常有16位和24位。16位意味着你听到的声音可以有2的16次方也就是65536种变化。
  • 声道:立体声或者是单声道,决定音频是否使用两条音轨来对应左右耳的不同表现。值得注意的是,目前似乎无论使用什么样的压缩方式,使用立体声都意味着容量相对单声道的翻倍。
  • 时间:一秒就是一秒,至少目前,无论什么压缩方式,资源容量在时间维度上是完全线性的变化

根据上面这些信息,我们可以很容易的计算出一张74分钟42秒(极限容量)的CD格式的音乐所需要的容量:

44100(Hz) * 16(bits) * 2(stereo) * (74 * 60 + 42) = 771.8MB

CD音质在数字音乐中也算是品质相当好的了,体积也是相当大的,实际项目开发中是很难接受这种无压缩的格式给容量上带来的负担的。在互联网领域,有着像MP3这样的压缩格式,以有限的音质损失换取文件体积上极大的缩减。在游戏领域对体积不像互联网领域那么敏感,但却对性能方面会有些要求。

压缩格式

以Wwise为例,Wwise提供了ADPCM、Vorbis、Opus几种压缩格式可供实际开发中选择:

  • ADPCM:提供约1:4的固定压缩比率,较低的CPU负担
  • Vorbis:默认质量提供1:9~12的高压缩率,CPU的计算成本会比ADPCM高一些
  • Opus:Vorbis的改进版本,理论上会比Vorbis有更好的压缩率和更低的CPU成本,在我们的测试中表现和Vorbis相差其实不大

根据官方文档的建议,ADPCM格式比较适合游戏内的长度较短,复发率非常高的音效,比如像射击游戏中的枪声、RPG的技能音效等;Vorbis/Opus比较适合长度较长,游戏内发生数不高的一类音效,比如背景音乐、环境声以及剧情人物对话等等。

Tips

在实际测试中,发现了另外两点值得注意的细节:

  • 一个是人声类的音频可以设置更高的压缩率(较低的质量),因为人声的发声频率范围较小,非常禁得住压缩而不会丢失太多的细节,在实际测试中使用Vorbis quality 2单声道的压缩方式(作为木耳朵的我很难听出区别)可以将每分钟的成本降至约500KB,这意味着游戏中一个小时的剧情语音仅需要使用40MB不到容量。我一直觉得剧情对话全语音是个很奢侈的事情,现在这么看至少在容量上还是可以承受的,相反可能声优录制的成本才是开发商特别需要关注的。
  • 另一个是在保证表现的同时应该尽量使用单声道,除了有些内容比如背景音乐、环境音、UI菜单音效(音效部的同学特别提到)等需要保证声音的表现力外,像游戏场景内的点声源,人物对话等使用单声道是完全没有太大问题的,因为相比起各种高端的压缩算法,都比不过使用单声道降低资源容量来的直接有效。

成本推算

优化过后根据上述分类我们可以大致推算出不同的音效资源的使用成本:

  • 背景音乐:使用Vorbis/Opus格式,双声道,默认压缩率,每分钟约800KB的成本,一张CD长度的音乐压缩后约64MB
  • 短音效:使用ADPCM格式,根据需要设置单/双声道,Auto medium压缩率,双声道每分钟约2.3MB的成本,单声道折半
  • 剧情对话类:使用Vorbis/Opus格式,单声道,较低质量,每分钟约500KB的成本,1个小时的长度可以压缩至40MB以内

内存

游戏项目中关于音频的内存优化部分可讲的并不多,因为不存在像美术贴图资源那样需要打包或者存在解压缩的步骤。一个简单可靠的加/卸载机制和合理使用他们的时机足以出色的完成音频资源内存管理的工作。结合Wwise的SoundBank机制,可以总结下面几条Tips:

  • 常驻内存的音效:你终归是需要有部分音效常驻内存的,一些很短、很高复发率并且随时会发声的音效,比如暂停菜单的音效。这一类的音效要避免反复加/卸载,增加内存碎片风险的同时浪费了I/O的性能,我们需要做的其实仅仅是合理的划分这部分音效资源并控制它的规模。
  • :对于游戏内固定数量的长音效,比如背景音乐、剧情对话、环境声,使用流来播放非常有必要,相当于用游戏进行时一定的I/O性能来换取极大的内存节省。要注意控制使用流播放的音频可能的最大并发数
  • 按照游戏逻辑来划分SoundBank:这样我们可以通过仅加载必要的SoundBank来避免内存使用上的浪费,比如按照不同地图特有的环境音效,按照怪物种类、角色、武器来划分,这样在进入关卡战斗时我们可以根据预知的关卡和我方角色来仅加载必要的音频资源

结论

对于游戏项目开发来说,除非是对音频的表现有特殊的要求,对一般的项目来看音频部分的实现与使用在技术层面上的优化还都是相对比较好理解的,更需要强调是项目能够对于音频功能合理的设计和正确的使用,避免浪费不要的软硬件资源,把好钢用在刀刃上。