簡體   English   中英

XAudio2 語音池

[英]XAudio2 voice pooling

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

在本次演講中: 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 使用內部 memory 池處理具有相同格式的聲音。 這意味着 memory 分配語音的頻率會降低,因為創建然后銷毀更多語音。 為了最大限度地減少即時分配,標題可以預先創建預期的最大語音數量,然后根據需要刪除它們。 然后將重用來自 XAudio2 池的聲音 memory 池綁定到 XAudio2 引擎實例。

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

為了避免因阻塞的 DestroyVoice 調用而中斷標題線程,應用程序可以在單獨的非關鍵線程上銷毀語音,或者應用程序可以使用語音池策略來重用語音而不是銷毀它們 請注意,語音只能用於具有相同數據格式和創建語音的相同通道數的音頻。 通過使用適當的比率參數調用 IXAudio2SourceVoice::SetFrequencyRatio,語音可以播放與語音不同的采樣率的音頻數據。

這有關於再次匯集的信息,這使得我似乎應該匯集聲音。 有誰知道哪些信息是正確的? 我應該匯集聲音還是應該將它留給 XAudio2 的內部匯集器?

文檔並不一致,但有點微妙。 如果您只是創建具有相同格式的聲音,那么它們將在內部被重用以幫助最小化創建/銷毀聲音的成本。

但是,您可以進一步使用 go 並直接在應用程序級別重用源語音。 它們必須使用相同的基本格式(PCM 與 ADPCM、比特率和通道數),但它們可以是不同的采樣率。

有關語音重用的示例代碼,請參閱DirectX Tool Kit for Audio

對於游戲,您可能還希望優先考慮聲音並使用“聲音竊取”來避免一次播放太多聲音,這無論如何都會造成混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM