版本

menu_open
目标平台:

控制Android上的延迟

Android音频延迟一直都是所有应用的问题之一。虽然通常延迟低于100ms,但有些设备的延迟高达150ms。

在最近的操作系统版本中,谷歌引入了“快速音频路径”。如果满足一些条件,这样做会旁通一些内部处理,极大地减少操作系统和硬件处理的延迟。总体延迟可以减少到几十毫秒。重要的是要注意到,并没有规定要求硬件厂商必须实现快速音频路径;所以,很多生产商不会去做。此外,有些设备没有真的实现快速通道,但会号称实现了。因此,游戏不能放心假设在终端用户的设备上有快速音频路径存在。如果您的游戏是针对广泛目标市场,则在设计游戏音频时不应该使用该功能。

一般来说,更低的延迟会引发更高的CPU消耗。RTPC更新的处理、游戏对象位置、以及其他游戏输入都是每帧进行的。因此,帧越小,处理进行得就越频繁。延迟和CPU占用之间的平衡点可以通过实验找到。没有什么死规矩。

Wwise 初始化设置控制延迟

有些设置会在Wwise SDK中控制音频延迟:

默认设置,通用延迟

AK::SoundEngine::GetDefaultSettings()AK::SoundEngine::GetDefaultPlatformInitSettings() 返回的默认设置在大部分情况下对大部分设备来说是“安全的”设置。使用这些会将:

  • uSampleRate 设置成硬件偏好数值。这一般是48 kHz或44.1 kHz.
  • uNumSamplesPerFrame设置成1024
  • uNumRefillsInVoice设置成4

优势:这一设置能在大部分设备上比较好地防止匮乏。对于音频设计的CPU占用限制也少得多。
劣势:它有长度为 1024 * 4 个采样点的延迟(大约86ms),加上同步延迟(0到21ms),再加上硬件处理延迟(看情况)。

最低延迟设置

想要用最低延迟来初始化Wwise,就调用 \ c AK::SoundEngine::GetDefaultSettings()AK::SoundEngine::GetDefaultPlatformSettings(),然后再调用 AK::SoundEngine::GetFastPathSettings()。这会用设备偏好来取代默认设置。

这会将:

  • uSampleRate 设置成硬件偏好数值。这一般是48 kHz或44.1 kHz.
  • uNumSamplesPerFrame设置成硬件偏好数值。这个值介于96到512个采样之间,视设备而定。通常大约是128或240个采样点。 -uNumRefillsInVoice手动改为2。

优势:延迟视设备而定,但通常范围是240 * 2个采样(10 ms),加上硬件(未知)。
劣势:可用CPU受限。分配给渲染音频的时间非常短,而且很容易被其他系统上的事件打断。音频设计的CPU开销(比如RTPCs、切换开关、定位、以及容器)会是一个问题,需要仔细监控。

最小和最大延迟的中间点

根据目标设备和音频设计,在上述两种设置中间有一个折衷点,每名游戏程序员必须找到这个折衷点。您可以将 uNumSamplesPerFrame 改为整数倍,并且只要有条件用时就仍然可以用快速音频路径。还有一种方式可以控制CPU开销:如果您将uNumSamplesPerFrame改成原来的两倍,, Wwise行为开销的计算频率将降低一半。

在大部分游戏中uNumRefillsInVoice 需要至少设置成3,通常为4,这样能为CPU占用变化留出余量。

优势:CPU占用不受硬件限制。音频渲染时间可以有很大变化,从而允许更复杂更动态的设计。
劣势:CPU可用性无法保证。因此根据音频设计和其它占用(比如游戏中的其它和设备上的其它应用),可能需要更高的缓冲(延迟)。

蓝牙的例外

正如Android程序员备注中所说,蓝牙设备不支持低延迟,也不支持使用快速路径。实际上,为了在蓝牙设备上拥有无故障的音频,缓冲必须更高,每一帧也必须更大。Wwise将会检测蓝牙耳机的占用,并且会自动重置音频硬件来得到长度为8192个采样点的延迟,大约180ms。


此页面对您是否有帮助?

需要技术支持?

仍有疑问?或者问题?需要更多信息?欢迎联系我们,我们可以提供帮助!

查看我们的“技术支持”页面

介绍一下自己的项目。我们会竭力为您提供帮助。

来注册自己的项目,我们帮您快速入门,不带任何附加条件!

开始 Wwise 之旅