directx如何使用:使用DirectX优化声音特性

作者:谭翁

微软所提供开发工具包括系列专为游戏和交互DircetXDirectSound以及Direct3Dsound音频媒体设计人员开发强有力工具DirectX充分利用了声音加速硬件以尽可能提高其运行速度减少CPU占用时间但是音频信号仍然对整个系统运行产生着重大影响本文所描述技术将帮助用户使用DirectSound以及Direct3DSound以减少音频重放对系统运行影响  

微软所提供开发工具中DirectX波形声音重放设备是为支持在Windows95和WindowsNT中开发游戏和交互媒体应用而设计DirectSound和Direct3DSound允许你在同个 3维空间中同时运行多个声音文件和移动声音源只要有可能DirectX将充分利用声音加速设备来改善运行状况和减少CPU使用但这并不是说你可在 3维空间运行、编译充斥着大量声音代码并且随心所欲地将其移来移去如果你并没有注意如何使用计算机声音资源你将很快发现计算机CPU周期绝大部分被你自己添加个户外历险游戏44.1khz16位立体声优美声音所占去  

窍门技巧和技术  
首先我们来谈谈些有关定义你所熟悉DirectSound包括以下些术语:  
从缓冲区:  
是指用来执行波形数据应用缓冲区每个执行波形文件都有个从缓冲区每个这样缓冲区都有自己特定格式  

主缓冲区:  
是DirectSound输出缓冲区般说来应用并非将波形数据直接写入主缓冲区相反DirectSound首先在从缓冲区中将波形数据加以合成然后输入主缓冲区中注意:仅有个主缓冲区并且其格式决定了其输出格式  

静态缓冲区:  
包含了内存中个完整声音通过次简单操作你能在缓冲区中写入个完整声音所以他们对于用户十分方便静态缓冲区通过声卡合成加速执行  

流缓冲区:  
仅仅为声音部分利用它我们并不需要大量内存就能运行较长声音文件在利用流缓冲区时用户必须周期性在声音缓冲区中写入数据但是流缓冲区不能在硬件中进行声音合成  

我们将再次提到DirectSound合成器这种DirectSound元件负责从缓冲区中将声音中按位隔行合成然后执行诸如:音量大小、均衡调节(左右声道平衡)、频率转换以及 3维操纵等操作当合成器不能识别你通过API存放组件时(区别于上面所述控制操作)这正是DirectSoundCPU核心所要做些运行问题将在"DirectSound合成器发生了什么情况"项目中加以讨论  

如果DirectSound开发小组成员见到上面示意图他们将对此不屑合成器远比上图所展示优秀上图中我并没有任何和合成器相关 3维组件以及其他类型进程  

既然我们获得背景知识远比上面所述我们将进步接触其他系列对我们有用东西以下是帮助你最大限度使用DirectSound功能个技术列表  

巧妙使用声音窍门技巧  

在主缓冲区中使用相同格式  

将主缓冲区设置为最低存储速率格式  

在短促频繁无声时间间隔内连续地使用主缓冲区  

尽可能地使用硬件进行声音合成  

最大限度保证控制变换  

使用延时 3维进程命令  
下面我们将对上面所述各项技术作详细介绍说明  
.巧妙使用声音窍门技巧  
DirectSound最为优秀特征的就是独立演奏、控制多声道音频信号能力旦声音设计者真正地掌握了它们那么真可以称得上是本万利花费只是CPU指令周期每个你所使用从缓冲区都将消耗CPU指令周期次诸如频率量化等进程操作都将带来CPU指令周期额外消耗 3维声音将比常规声音消耗更多CPU指令周期这些读者能够想象得到吗?  
你应该同你声音设计者坐下来起探讨下全方位地利用声音演奏带来强烈震撼(如果你自己本身就是员及声音设计者那么你就自己个人静下心来仔细领略下)研究下究竟是哪种声音在将你渴望以久经历传递给用户过程中起着最为重要作用当可能减少从缓冲区使用时请采用声音预混技术例如:如果你正在个声道中模仿蟋蟀低吟而在另个声道中记录了田蛙欢唱以烘托出夏夜氛围时请将它们合成到个声道中  

如果在你脑海中有应用初步方案并且在以后将对其进行折衷处理时候你应该对该进程进行相当程度简化但要记住想要设计出相当精练实用声音你需要长时间地字斟句酌BeatlesSgt.Pepper'sLonelyHeartsClubBand就是个有创意伟大杰作它被记录在盘 4声道盒式录音带中和此形成对照现代音频记录设备提供了至少 4十 8个声道并能提供真正可用来进行实用合成无限多声道盒式录音带以及可利用MIDI序列发生器  

2.在主缓冲区中使用相同数据格式  
DirectSound合成器将每个从缓冲区中数据转换为主缓冲区数据格式这种数据转换是在数据进入主缓冲区合成过程中实现它也将占用CPU周期你可以在保证从缓冲区(例如波形文件)和主缓冲区具有相同数据格式前提下消除这笔开销事实上正是由于DirecSound这种格式转换方式你所要做仅仅是对比样例速率和声道数即使样例速率(8位或16位)存在些差别也没有关系它唯后果只是降低主缓冲区数据存取速率  
到目前为止大多数声卡都是ISA总线卡它通过DMA方式将声音数据从系统内存移动到当地缓冲区中处理器在进行内存读写的前将被迫等待DMA数据传输结束这势必会影响到CPU运行速度对于ISA总线声卡上述数据传送方式无疑将对系统运行产生不可回避影响但并不会对新型32位PCI卡产生任何影响  

对于DirectSoundDMA数据传输影响直接关系到数据输出速率以及主缓冲区访问速率我曾听说过这样趣事:在台主频为90Mhz奔腾机上运行基本格式为44.1Khz16位立体声音乐DMA将占用多达30%CPU指令周期!DMA数据传输正是影响DirectSound运行最大原因值得庆幸上述问题在你无法顺利执行时非常容易处理实验表明减少数据存取速率最好办法是改变主缓冲区中数据格式这里转换十分明显运行改变了声音品质要改变主缓冲区中数据格式只需思路方法IDirectSoundBuffer::Setformat但不要忘记:你协作层设置成DSSCL.PRIORITY或DSSCL_EXCLUSIVE以避免主缓冲区耗费  

3.在无声时间间隔中连续使用主缓冲区  
DMA同时从另个方面影响着系统运行当没有声音播放时DirectSound停止了合成器工作和DMA活动如果你中存在着短促频繁无声时间间隔在每次声音播放时使合成随声音播放时间断而起起停停将比你让合成器直处于连续工作状态情况更糟在这种情况下你可以在主缓冲区中强制性思路方法PLAY使合成器处于激活状态这样即使在没有声音播放时合成器也将连续工作此时为了恢复停止合成器缺省方式我们可以在主缓冲区中思路方法STOP  
4.使用硬件进行声音合成  
如果系统中装配了支持声卡DirectSound驱动器大多数声卡都支持定水平硬件合成下面段小窍门将允许你尽量使用硬件合成  

在你进行硬件声音合成时使用静态缓冲区DirectSound将试图在静态缓冲中进行声音合成  

为你用得最多声音文件建立声音缓冲区(可用来进行声音硬件合成合成器是有限度  

在声音文件运行时使用思路方法IDirectSound::GetCaps决定声音加速硬件支持何种格式并尽可能采用这些格式(些声卡只能合成特定格式声音文件例如:SoundBlasterAWE32声卡只能合成单16位格式声音文件)  
当你CreatSoundBuffer建立从缓冲区时你得建立静态缓冲区在结构DSBUFFERDESCdwPlag区域设定DSBCAPS_LOCHARDWARE标志你也可以通过设定DSBCAPS_LOCHARDWARE标志将缓冲区数据进行强制性硬件合成但是硬件合成所要使用资源不可用时CreatSoundBuffer就将出错  
思路方法IDirectSound::GetCaps为我们提供了有关声音加速能力详尽描述这对于我们进行存取操作有很大邦助我们在其工作时间内可以GetCaps调整音频系统以最佳方式使用硬件资源在DirectX文档中查看结构DSAPS和标志DSCAPS.dwFlags可使我们准确了解到些系统有用信息  

5.最低限度进行声音控制变换  
在从合成器中改变均衡、音量或频率也将影响到应用运行为了防止声音输出时中断产生DirectSound合成器必须提前20到100毫秒甚至更多时间进行声音合成当你进行声音控制变换时合成器不得不刷新正在进行声音合成缓冲区信息重新合成以适应适应变化比较好思路方法是尽量减少送入系统控制改变次数这在按流或群输入时显得尤为重要同时我们应尽量减少日常SetVolume、SetPn、SetFrequency不连续操作例如:如果你进行帧同步定期检测需要将适应从左声道扬声器移动到右声道扬声器时你就应该每帧SetPan而不是每帧两次  
注意: 3维控制变换(方向、位置、速度、多普勒因子等等)也将引起DirectSound合成器在其先前进行合成缓冲区中重新合成但是你也可以将系列 3维控制变换集合在组中这将只使DirectSound合成器只进行次重新合成请仔细阅读以下有关延时控制变换详细介绍说明章节  

6.使用延时 3维进程命令  
正如我在前面所说那样 3维声音将比常规声音花费更多CPU指令周期这是在每个合成周期内为计算出 3维立体声音效将占用更多CPU指令周期你应该尽可能地减少使用 3维立体声最好不要使用那些并不对你真正有用 3维声音这是通过实战得出在你运行时影响整个系统工作原因在设计你应用你应该尽早进行尝试使其更加容易使声音具有或没有 3维效果你也可以具有DS3DMODE_DISABLE标志思路方法IDirectSound::SetMode使得 3维进程能够在 3维缓冲区中运行  
改变 3维声音缓冲区以及听众进行诸如对方位、速度、多普勒因子操作都将引起DirectSound合成器重新合成先前合成缓冲区中信息当然这将浪费CPU指令周期为了使 3维设置改变对系统运行影响降低到最小程度你就应该使用延时 3维进程命令这是DirectSound 3维声音组件所特有特征为了使用 3维延时进程命令请设定每个 3维设置变换(SetPosition,SetVelocity等等)中思路方法IDirect3DListener或Direct3DSoundBufferdwApply参数DS3DMODE_DISABLE标志并且将所有这些变化制成随后IDirect3DListener::CommitDeferredSettings去执行所有延时命令在先前合成缓冲区中进行次重新合成  

我已经为读者罗列了系列利用DirectX优化音频媒体特殊工具我所能给予你最好建议是:设计你支持运行、监视和音量调节音频子系统毫无疑问你必须保证你有充足时间等待你运行!如果你从开始就将运行协调性考虑进去这个任务将变得更加容易
Tags:  怎样使用directx directx怎么使用 directx的使用 directx如何使用

延伸阅读

最新评论

发表评论