audio - 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 的内部汇集器?
解决方案
文档并不一致,但有点微妙。如果您只是创建具有相同格式的声音,那么它们将在内部被重用以帮助最小化创建/销毁声音的成本。
但是,您可以更进一步,直接在应用程序级别重用源语音。它们必须使用相同的基本格式(PCM 与 ADPCM、比特率和通道数),但它们可以是不同的采样率。
有关语音重用的示例代码,请参阅DirectX Tool Kit for Audio。
对于游戏,您可能还希望优先考虑声音并使用“声音窃取”来避免一次播放太多声音,这无论如何都会造成混乱。
推荐阅读
- c++ - 如何检查 QTreeWidget 中的标志状态?
- mysql - 使用“加载数据文件”时的参数查询
- windows - 无法排除 C1.WPF.4.dll。来自依赖项和安装程序项目
- angular - 在 mat-horizontal-stepper 标签之外拥有所有 mat-horizontal-stepper 步骤的主体
- android - 如何检查 Espresso 中的待处理意图数组?
- javascript - Create-React-App 在 Edge 浏览器中不起作用
- ibm-cloud - IBM Cloud:在“经典基础架构”下设置时如何通过 API 访问 DNS 条目
- python-3.x - 如何将字典中的值与嵌套字典中的值关联?
- r - package expss:以与值标签相同的格式打印多个响应的标签
- arrays - 使用数组和通配符自动过滤 VBA