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

音频渲染线程

在默认情况下,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()

并行执行音频渲染任务

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

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

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