DirectX 優化聲音特性

內容摘要
    微軟所提供開發工具包括一系列專爲遊戲和交互DircetX
DirectSound 以及 Direct3Dsound音頻媒體的程序設計人員開發的
強有力的工具。DirectX充分利用了聲音加速硬件以儘可能的提高其
運行速度,減少CPU的佔用時間。但是,音頻信號仍然對整個系統的
運行產生着重大影響。本文所描述的技術將幫助用戶使用
DirectSound 以及Direct3DSound以減少音頻重放對系統運行的影
響。
前 言
    微軟所提供的開發工具中DirectX 波形聲音重放設備是爲支持
在Windows 95 和Windows NT 中開發遊戲和交互媒體應用程序而設
計的。 DirectSound 和 Direct3DSound允許你在同一個三維空間中
同時運行多個聲音文件和移動聲音源。只要有可能DirectX ,將充
分利用聲音加速設備來改善運行狀況和減少CPU的使用。但這並不是
說你可在三維程序空間運行、編譯充斥着大量聲音代碼的程序,並
且隨心所欲地將其移來移去。如果你並沒有注意如何使用計算機的
聲音資源你將很快發現,你的計算機的CPU週期絕大部分被你自己添
加的一個戶外歷險遊戲的44.1khz,16位立體聲的優美聲音所佔去。
技巧 和 技術
    首先,我們來談談一些有關的定義。你所熟悉的DirectSound包
括以下一些術語:
從緩衝區:
    是指用來執行波形數據的應用程序緩衝區。每個執行的波形文
件都有一個從緩衝區,每個這樣的緩衝區都有自己特定的格式。
主緩衝區:
    是DirectSound的輸出緩衝區。一般說來,應用程序並非將波形
數據直接寫入主緩衝區。相反,DirectSound首先在從緩衝區中將波
形數據加以合成,然後輸入主緩衝區中。注意:僅有一個主緩衝
區,並且其格式決定了其輸出格式。
靜態緩衝區:
    包含了內存中的一個完整的聲音。因爲,通過一次簡單操作,
你能在緩衝區中寫入一個完整的聲音。所以,他們對於用戶十分方
便。靜態緩衝區通過聲卡的合成加速執行。
流緩衝區:
    僅僅爲聲音的一部分,利用它,我們並不需要大量的內存就能
運行較長的聲音文件。在利用流緩衝區時,用戶必須週期性的在聲
音緩衝區中寫入數據。但是,流緩衝區不能在硬件中進行聲音合
成。
    我們將再次提到 DirectSound 合成器。這種 DirectSound 元
件負責從緩衝區中將聲音中按位隔行合成。然後執行諸如:音量大
小、均衡調節(左右聲道平衡)、頻率轉換,以及三維操縱等操
作。當合成器不能識別你通過API存放的組件時(不同於上面所述的
任一控制操作),這正是 DirectSound 的 CPU 核心所要做的。一
些運行問題將在“ DirectSound 合成器發生了什麼情況”的項目中
加以討論。下面的關於合成器和主、從緩衝區之間關係的示意圖,
將使讀者清楚地瞭解他們之間的關係。
    圖通過一個簡單的示意圖闡明緩衝區和 DirectSound 合成器之
間的關係
    如果 DirectSound 開發小組成員見到上面的示意圖,他們將對
此不屑一顧。因爲,合成器遠比上圖所展示的優秀。上圖中,我並
沒有任何與合成器相關的三維組件,以及其他類型的進程。
    既然,我們獲得的背景知識遠比上面所述的多,我們將進一步
接觸其他一系列對我們有用的東西。以下是幫助你最大限度的使用
DirectSound功能的一個技術列表。
1. 巧妙使用聲音的技巧;
2. 在主緩衝區中使用相同的格式;
3. 將主緩衝區設置爲最低存儲速率的格式;
4. 在短促頻繁的無聲時間間隔內連續地使用主緩衝區;
5. 儘可能地使用硬件進行聲音合成;
6. 最大限度的保證控制變換;
7. 使用延時的三維進程命令;

下面我們將對上面所述的各項技術作詳細的說明。
一.巧妙使用聲音的技巧
    DirectSound的最爲優秀的特徵之一就是獨立演奏、控制多聲道
音頻信號的能力。一旦聲音的設計者真正地掌握了它們,那麼,真
可以稱得上是一本萬利。唯一的花費只是CPU指令週期。每個你所使
用的從緩衝區都將消耗CPU指令週期。每一次諸如頻率量化等的進程
操作都將帶來CPU指令週期的額外消耗。三維聲音將比常規聲音消耗
更多的CPU指令週期。這些讀者能夠想象得到嗎?
    你應該同你的聲音設計者坐下來一起探討一下全方位地利用聲
音演奏帶來的強烈震撼(如果你自己本身就是程序員及聲音設計
者,那麼你就自己一個人靜下心來仔細領略一下),思考一下究竟
是哪種聲音在將你的渴望以久的經歷傳遞給用戶的過程中起着最爲
重要的作用。當可能減少從緩衝區的使用時,請採用聲音預混技
術。例如:如果你正在一個聲道中模仿蟋蟀的低吟,而在另一個聲
道中記錄了田蛙的歡唱以烘托出夏夜的氛圍時,請將它們合成到一
個聲道中。
    如果在你的腦海中有應用程序的初步方案,並且在以後將對其
進行折衷處理的時候,你應該對該進程進行相當程度的簡化。但要
記住,想要設計出相當精練的實用聲音程序,你需要長時間地字斟
句酌。Beatles的Sgt.Pepper's LonelyHearts Club Band 就是一個
有創意的偉大傑作。它被記錄在一盤四聲道盒式錄音帶中。與此形
成對照,現代的音頻記錄設備提供了至少四十八個聲道,並能提供
真正的可用來進行實用合成的無限多聲道的盒式錄音帶以及可利用
的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決定聲音
加速硬件支持何種格式,並儘可能的採用這些格式(一些聲卡只能
合成特定格式的聲音文件。例如:SoundBlaster AWE32聲卡只能合
成單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優化音頻媒體的特殊工
具。我所能給予你的最好的建議是:設計你的支持運行、監視和音
量調節的音頻子系統。毫無疑問,你必須保證你有充足的時間等待
你的程序的運行!如果你從一開始就將程序運行的協調性考慮進
去,這個任務將變得更加容易。
       
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章