版本

menu_open
Wwise SDK 2021.1.14
自由调度音频渲染任务

音频渲染线程

在默认情况下,Wwise 声音引擎在名为AK::EventManager 的专门线程中执行所有命令处理和音频渲染,该线程由AkPlatformInitSettings::threadLEngine 参数控制。调用 AK::SoundEngine::RenderAudio 表明游戏帧结束,线程可处理自上次调用 RenderAudio 以来的所有 API 命令。

AkInitSettings::bUseLEngineThread 设为 false 会禁用此线程,促使 RenderAudio 同步执行命令处理和音频渲染(如有必要)。音频输出的实际速度仍由音频终端控制。若 RenderAudio 调用间隔短于 AkInitSettings::uNumSamplesPerFrame 和输出采样率限定的缓冲周期,则有些 RenderAudio 调用将跳过音频渲染部分。相反,若 RenderAudio 调用间隔长于输出缓冲周期,则 RenderAudio 可能会一次处理多个缓冲区,导致出现 CPU 用量峰值,并可能最终造成音频卡顿。

启用离线渲染会禁止音频线程异步执行命令处理和音频渲染。每次调用 RenderAudio 时渲染的音频数量取决于发给 AK::SoundEngine::SetOfflineRenderingFrameTime 的非零正值。零值或负值会强制 RenderAudio 精准处理一个音频缓冲区。

注意: 在禁用音频渲染线程或启用离线渲染时,不得从 RenderAudio 调用方的同一线程同步调用 AK::SoundEngine::LoadBankAK::SoundEngine::UnloadBank API。因为这些调用可能会阻塞线程,直到有音频缓冲区被渲染来完成 Stop 操作并释放 SoundBank 媒体(只有并发调用 RenderAudio 才能实现)。

在 Microsoft 平台上,由于使用了单线程单元 (STA) 并发模型,在将 AkInitSettings::bUseLEngineThread 设为 false 时,必须从调用 AK::SoundEngine::RenderAudio 的同一线程调用 CoInitializeEx()

使用 Query API 函数

有些 AK::SoundEngine::Query 函数可能会导致 CPU 用量突然增加。为了最大限度地减少 CPU 用时并确保最佳性能,建议遵守以下准侧:

  • 在开发版本中使用 Query 函数,避免在生产环境中使用它们。
  • 如有必要使用 Query 函数,请在 SoundEngine 全局回调内使用(参见 AkGlobalCallbackLocation)。比如,若要读取 RTPC 值,可将代码放在 AkGlobalCallbackLocation_BeginRender 或 AkGlobalCallbackLocation_EndRender 中。

并行执行音频渲染任务

在默认情况下,Wwise 声音引擎会在音频渲染线程中执行 Bus(总线)和 Voice(声部)处理。

您可以通过 AkInitSettings::taskSchedulerDesc 来并行处理各项 Bus 和 Voice 任务。Wwise 会针对任意一组可安全并发执行的任务调用 AkTaskSchedulerDesc::fcnParallelFor 回调。此请求可传给游戏端任务计划程序,以此为各个工作线程指派执行范围。

备注: 在启动并行执行时,同时运行的任务计划程序线程会生成部分 AK::SoundEngine 回调。
备注: 有些插件可能不支持并行执行。

此页面对您是否有帮助?

需要技术支持?

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

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

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

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

开始 Wwise 之旅