首页 > 解决方案 > XAudio2 语音池

问题描述

我似乎有一些相互矛盾的信息,我不确定什么是最新的,什么是正确的。

在本次演讲中:https ://www.microsoft.com/en-us/download/details.aspx?id=6871

他们建议在应用程序级别汇集声音,因为破坏声音是有代价的。

但是,查看https://docs.microsoft.com/en-us/windows/win32/api/xaudio2/nf-xaudio2-ixaudio2-createsourcevoice

它指出:

XAudio2 对具有相同格式的声音使用内部内存池。这意味着随着更多的声音被创建然后被销毁,声音的内存分配将不那么频繁地发生。为了最大限度地减少即时分配,标题可以预先创建预期的最大语音数量,然后根据需要删除它们。然后将重用来自 XAudio2 池的声音。内存池绑定到 XAudio2 引擎实例。

所以这让我相信我不需要池,因为 XAudio2 有内部池。然后在另一部分: https ://docs.microsoft.com/en-us/windows/win32/api/xaudio2/nf-xaudio2-ixaudio2voice-destroyvoice

为避免因阻塞 DestroyVoice 调用而中断标题线程,应用程序可以在单独的非关键线程上销毁语音,或者应用程序可以使用语音池策略来重用语音而不是销毁它们。请注意,语音只能用于具有相同数据格式和创建语音的相同通道数的音频。通过使用适当的比率参数调用 IXAudio2SourceVoice::SetFrequencyRatio,语音可以播放与语音不同的采样率的音频数据。

这有关于再次汇集的信息,这使得我似乎应该汇集声音。有谁知道哪些信息是正确的?我应该汇集声音还是应该将它留给 XAudio2 的内部汇集器?

标签: audiopoolvoicexaudio2

解决方案


文档并不一致,但有点微妙。如果您只是创建具有相同格式的声音,那么它们将在内部被重用以帮助最小化创建/销毁声音的成本。

但是,您可以更进一步,直接在应用程序级别重用源语音。它们必须使用相同的基本格式(PCM 与 ADPCM、比特率和通道数),但它们可以是不同的采样率。

有关语音重用的示例代码,请参阅DirectX Tool Kit for Audio

对于游戏,您可能还希望优先考虑声音并使用“声音窃取”来避免一次播放太多声音,这无论如何都会造成混乱。


推荐阅读