使用DirectX優化聲音特征
發表時間:2023-08-17 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作者:譚翁微軟所提供開發工具包括一系列專為游戲和交互DircetXDirectSound以及Direct3Dsound音頻媒體的程序設計人員開發的強有力的工具。DirectX充分利用了聲音加速硬件以...
作者:譚翁
微軟所提供開發工具包括一系列專為游戲和交互DircetXDirectSound以及Direct3Dsound音頻媒體的程序設計人員開發的強有力的工具。DirectX充分利用了聲音加速硬件以盡可能的提高其運行速度,減少CPU的占用時間。但是,音頻信號仍然對整個系統的運行產生著重大影響。本文所描述的技術將幫助用戶使用DirectSound以及Direct3DSound以減少音頻重放對系統運行的影響。
微軟所提供的開發工具中DirectX波形聲音重放設備是為支持在Windows95和WindowsNT中開發游戲和交互媒體應用程序而設計的。DirectSound和Direct3DSound允許你在同一個三維空間中同時運行多個聲音文件和移動聲音源。只要有可能DirectX,將充分利用聲音加速設備來改善運行狀況和減少CPU的使用。但這并不是說你可在三維程序空間運行、編譯充斥著大量聲音代碼的程序,并且隨心所欲地將其移來移去。如果你并沒有注意如何使用計算機的聲音資源你將很快發現,你的計算機的CPU周期絕大部分被你自己添加的一個戶外歷險游戲的44.1khz,16位立體聲的優美聲音所占去。
技巧和技術
首先,我們來談談一些有關的定義。你所熟悉的DirectSound包括以下一些術語:
從緩沖區:
是指用來執行波形數據的應用程序緩沖區。每個執行的波形文件都有一個從緩沖區,每個這樣的緩沖區都有自己特定的格式。
主緩沖區:
是DirectSound的輸出緩沖區。一般說來,應用程序并非將波形數據直接寫入主緩沖區。相反,DirectSound首先在從緩沖區中將波形數據加以合成,然后輸入主緩沖區中。注意:僅有一個主緩沖區,并且其格式決定了其輸出格式。
靜態緩沖區:
包含了內存中的一個完整的聲音。因為,通過一次簡單操作,你能在緩沖區中寫入一個完整的聲音。所以,他們對于用戶十分方便。靜態緩沖區通過聲卡的合成加速執行。
流緩沖區:
僅僅為聲音的一部分,利用它,我們并不需要大量的內存就能運行較長的聲音文件。在利用流緩沖區時,用戶必須周期性的在聲音緩沖區中寫入數據。但是,流緩沖區不能在硬件中進行聲音合成。
我們將再次提到DirectSound合成器。這種DirectSound元件負責從緩沖區中將聲音中按位隔行合成。然后執行諸如:音量大小、均衡調節(左右聲道平衡)、頻率轉換,以及三維操縱等操作。當合成器不能識別你通過API存放的組件時(不同于上面所述的任一控制操作),這正是DirectSound的CPU核心所要做的。一些運行問題將在"DirectSound合成器發生了什么情況"的項目中加以討論。
如果DirectSound開發小組成員見到上面的示意圖,他們將對此不屑一顧。因為,合成器遠比上圖所展示的優秀。上圖中,我并沒有任何與合成器相關的三維組件,以及其他類型的進程。
既然,我們獲得的背景知識遠比上面所述的多,我們將進一步接觸其他一系列對我們有用的東西。以下是幫助你最大限度的使用DirectSound功能的一個技術列表。
巧妙使用聲音的技巧
在主緩沖區中使用相同的格式
將主緩沖區設置為最低存儲速率的格式
在短促頻繁的無聲時間間隔內連續地使用主緩沖區
盡可能地使用硬件進行聲音合成
最大限度的保證控制變換
使用延時的三維進程命令
下面我們將對上面所述的各項技術作詳細的說明。
一.巧妙使用聲音的技巧
DirectSound的最為優秀的特征之一就是獨立演奏、控制多聲道音頻信號的能力。一旦聲音的設計者真正地掌握了它們,那么,真可以稱得上是一本萬利。唯一的花費只是CPU指令周期。每個你所使用的從緩沖區都將消耗CPU指令周期。每一次諸如頻率量化等的進程操作都將帶來CPU指令周期的額外消耗。三維聲音將比常規聲音消耗更多的CPU指令周期。這些讀者能夠想象得到嗎?
你應該同你的聲音設計者坐下來一起探討一下全方位地利用聲音演奏帶來的強烈震撼(如果你自己本身就是程序員及聲音設計者,那么你就自己一個人靜下心來仔細領略一下),思考一下究竟是哪種聲音在將你的渴望以久的經歷傳遞給用戶的過程中起著最為重要的作用。當可能減少從緩沖區的使用時,請采用聲音預混技術。例如:如果你正在一個聲道中模仿蟋蟀的低吟,而在另一個聲道中記錄了田蛙的歡唱以烘托出夏夜的氛圍時,請將它們合成到一個聲道中。
如果在你的腦海中有應用程序的初步方案,并且在以后將對其進行折衷處理的時候,你應該對該進程進行相當程度的簡化。但要記住,想要設計出相當精練的實用聲音程序,你需要長時間地字斟句酌。Beatles的Sgt.Pepper'sLonelyHeartsClubBand就是一個有創意的偉大杰作。它被記錄在一盤四聲道盒式錄音帶中。與此形成對照,現代的音頻記錄設備提供了至少四十八個聲道,并能提供真正的可用來進行實用合成的無限多聲道的盒式錄音帶以及可利用的MIDI序列發生器。
二.在主緩沖區中使用相同的數據格式
DirectSound合成器將每個從緩沖區中的數據轉換為主緩沖區的數據格式,這種數據的轉換是在數據進入主緩沖區的合成過程中實現的,它也將占用CPU周期。你可以在保證從緩沖區(例如波形文件)和主緩沖區具有相同的數據格式的前提下消除這筆開銷。事實上,正是由于DirecSound的這種格式轉換方式,你所要做的僅僅是對比樣例速率和聲道數,即使樣例速率(8位或16位)存在一些差別也沒有關系,因為它唯一的后果只是降低主緩沖區的數據存取速率
到目前為止,大多數聲卡都是ISA總線卡,它通過DMA方式將聲音數據從系統內存移動到當地緩沖區中,處理器在進行內存讀寫之前將被迫等待DMA的數據傳輸結束,這勢必會影響到CPU的運行速度。對于ISA總線聲卡,上述的數據傳送方式無疑將對系統的運行產生不可回避的影響,但并不會對新型的32位PCI卡產生任何影響。
對于DirectSound,DMA數據傳輸的影響直接關系到數據的輸出速率以及主緩沖區的訪問速率。我曾聽說過這樣的趣事:在一臺主頻為90Mhz的奔騰機上運行基本格式為44.1Khz,16位的立體聲音樂程序,DMA將占用多達30%的CPU指令周期!DMA數據傳輸正是影響DirectSound運行的最大因素。值得慶幸的是,上述問題在你無法順利執行時非常容易處理。實驗表明,減少數據存取速率的最好辦法是改變主緩沖區中的數據格式。這里的轉換十分明顯,運行改變了聲音的品質,要改變主緩沖區中的數據格式,只需調用方法IDirectSoundBuffer::Setformat,但不要忘記:你的協作層設置成DSSCL.PRIORITY或DSSCL_EXCLUSIVE,以避免主緩沖區的耗費。
三.在無聲時間間隔中連續使用主緩沖區
DMA同時從另一個方面影響著系統的運行。當沒有聲音播放時,DirectSound停止了合成器的工作和DMA的活動。如果你的程序中存在著短促頻繁的無聲時間間隔,在每次聲音播放時使合成隨聲音播放時的間斷而起起停停,將比你讓合成器一直處于連續的工作狀態的情況更糟。在這種情況下,你可以在主緩沖區中強制性的調用方法PLAY使合成器處于激活狀態。這樣,即使在沒有聲音播放時,合成器也將連續工作。此時,為了恢復停止合成器的缺省方式,我們可以在主緩沖區中調用方法STOP。
四.使用硬件進行聲音合成
如果系統中裝配了支持聲卡的DirectSound驅動器,大多數聲卡都支持一定水平的硬件合成。下面的一段小竅門將允許你盡量使用硬件合成。
在你進行硬件聲音合成時使用靜態緩沖區。DirectSound將試圖在靜態緩沖中進行聲音合成。
為你用得最多的聲音文件建立聲音緩沖區(可用來進行聲音硬件合成的合成器是有一定的限度的。
在聲音文件運行時,使用方法IDirectSound::GetCaps決定聲音加速硬件支持何種格式,并盡可能的采用這些格式(一些聲卡只能合成特定格式的聲音文件。例如:SoundBlasterAWE32聲卡只能合成單16位格式的聲音文件)。
當你調用CreatSoundBuffer建立從緩沖區時,你得建立靜態緩沖區,在結構DSBUFFERDESC的dwPlag區域設定DSBCAPS_LOCHARDWARE標志。你也可以通過設定DSBCAPS_LOCHARDWARE標志將緩沖區的數據進行強制性的硬件合成。但是,硬件合成所要使用的資源不可用時,CreatSoundBuffer就將出錯。
方法IDirectSound::GetCaps為我們提供了關于聲音加速能力的詳盡描述,這對于我們進行存取操作有很大的邦助。我們在其工作時間內可以調用GetCaps,調整音頻系統以最佳方式使用硬件資源。在DirectX文檔中查看結構DSAPS和標志DSCAPS.dwFlags可使我們準確了解到一些系統的有用信息。
五.最低限度的進行聲音控制變換
在從合成器中改變均衡、音量或頻率也將影響到應用程序的運行。為了防止聲音輸出時的中斷的產生,DirectSound合成器必須提前20到100毫秒,甚至更多的時間進行聲音合成。當你進行聲音控制變換時,合成器不得不刷新正在進行的聲音合成的緩沖區的信息,重新合成以適應適應的變化。比較好的方法是盡量減少送入系統的控制改變次數。這在按流或群輸入時顯得尤為重要。同時,我們應盡量減少日常的調用SetVolume、SetPn、SetFrequency的不連續操作。例如:如果你進行幀同步的定期檢測,需要將適應從左聲道揚聲器移動到右聲道揚聲器時,你就應該每幀調用SetPan一次,而不是每幀兩次。
注意:三維控制變換(方向、位置、速度、多普勒因子等等)也將引起DirectSound合成器在其先前進行合成的緩沖區中重新合成。但是,你也可以將一系列三維控制變換集合在一組中,這將只使DirectSound合成器只進行一次重新合成。請仔細閱讀以下關于延時控制變換詳細說明的章節。
六.使用延時三維進程命令
正如我在前面所說的那樣,三維聲音將比常規聲音花費更多的CPU指令周期。這是因為在每一個合成周期內,為計算出三維立體聲音效將占用更多的CPU指令周期。你應該盡可能地減少使用三維立體聲,最好不要使用那些并不對你真正有用的三維聲音。這是通過實踐得出的在你運行程序時影響整個系統工作的另一因素。在設計你的應用程序時,你應該盡早進行嘗試,使其更加容易使聲音具有或沒有三維效果。你也可以調用具有DS3DMODE_DISABLE標志的方法IDirectSound::SetMode,使得三維進程能夠在三維緩沖區中運行。
改變三維聲音緩沖區以及聽眾進行的諸如對方位、速度、多普勒因子的操作,都將引起DirectSound合成器重新合成先前合成緩沖區中的信息,當然,這將浪費一定的CPU指令周期。為了使三維設置的改變對系統運行的影響降低到最小程度,你就應該使用延時三維進程命令。這是DirectSound三維聲音組件所特有的特征為了使用三維延時進程命令,請設定每個三維設置變換(SetPosition,SetVelocity等等)中的方法IDirect3DListener或Direct3DSoundBuffer的dwApply參數的DS3DMODE_DISABLE標志,并且將所有的這些變化制成一幀,隨后,再調用IDirect3DListener::CommitDeferredSettings去執行所有的延時命令,在先前的合成緩沖區中進行一次重新合成。
我已經為讀者羅列了一系列利用DirectX優化音頻媒體的特殊工具。我所能給予你的最好的建議是:設計你的支持運行、監視和音量調節的音頻子系統。毫無疑問,你必須保證你有充足的時間等待你的程序的運行!如果你從一開始就將程序運行的協調性考慮進去,這個任務將變得更加容易。