荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 使用DircetX优化声音特性
发信站: BBS 荔园晨风站 (Thu Jan 21 22:45:49 1999), 转信


   为在Windows 95和Windows NT中开发游戏和交互DircetX DirectS
ound 以及Direct3Do und音频媒体的程序,微软提供了一系列强大的
工具。DirectX充分利用了声音加速硬件,以尽可能地提高其运行速度
,减少CPU的占用时间。但是,音频信号仍然对整个系统的运行具有重
大影响。 本文所描述的技术将帮助用户使用DirectSound 以及Direc
t3DSound以减少音频重放对系统运行的影响。

    概念和概述
    首先,我们来谈谈有关定义。大家所熟悉的DirectSound包括以下
一些术语:
    主缓冲区:
    是DirectSound的输出缓冲区。一般说来,应用程序并非将波形数
据直接写入主缓冲区。相反,DirectSound首先在从缓冲区中将波形数
据加以合成,然后输入主缓冲区中。注意:主缓冲区仅有一个,并且其
格式决定了其输出格式。
    从缓冲区:
    是指用来执行波形数据的应用程序缓冲区。每个执行的波形文件
都有一个从缓冲区,每个这样的缓冲区都有自己特定的格式。
    静态缓冲区:
    包含了内存中的完整的声音。只需一次简单操作,用户就可以在
缓冲区中写入一个完整的声音,所以它们用起来十分方便。静态缓冲
区通过声卡的合成加速执行。
    流缓冲区:
    仅仅为声音的一部分,利用它,我们不需要大量的内存就能运行较
长的声音文件。在利用流缓冲区时,用户必须周期性地在声音缓冲区
中写入数据。但是,流缓冲区不能在硬件中进行声音合成。
    DirectSound合成器元件负责从缓冲区中将声音中按位隔行合成,
然后执行诸如音量大小、均衡调节(左右声道平衡)、频率转换以及三
维操纵等操作。而合成器不是可以通过API访问的离散组件(不同于上
面所述的任一控制操作),这正是 DirectSound中深入到CPU核心的部
分。下面是合成器和主、从缓冲区之间的关系示意图。图1
    上图中,没有包含任何与合成器相关的三维组件以及其他类型的
进程。实际上合成器远比上图所展示的优秀。
    下面我们介绍一些DirectSound的使用技巧。

    巧妙使用声音
    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数据传输的影响直接关系到数据的输出速
率以及主缓冲区的访问速率。据说有过这样的趣事:在一台主频为90M
hz的奔腾机上运行基本格式为44.1Khz、16位的立体声音乐程序,DMA
占用多达30%的CPU指令周期!DMA数据传输正是影响DirectSound运行
的最大因素。值得庆幸的是,上述问题也很容易处理。实验表明,减少
数据存取速率的最好办法是改变主缓冲区中的数据格式。这里的交易
十分明显:性能和声音品质交易。要改变主缓冲区中的数据格式,只需
调用方法IDirectSoundBuffer::Setformat,但不要忘记:协作层要设
置成DSSCL_PRIORITY或DSSCL_EXCLUSIVE,以避免主缓冲区的耗费。
    在无声时间间隔中连续使用主缓冲区
    DMA同时从另一个方面影响系统的运行。当没有声音播放时,Dire
ctSound停止了合成器的工作和DMA的活动。如果程序中存在着短促频
繁的无声时间间隔,在每次声音播放时使合成随声音播放时的间断而
起起停停,这比让合成器一直处于连续的工作状态更糟。在这种情况
下,可以在主缓冲区中强制性地调用方法PLAY使合成器处于激活状态
。这样,即使在没有声音播放时,合成器也将连续工作。此时,为了恢
复停止合成器的缺省方式,我们可以在主缓冲区中调用方法STOP。

    使用硬件进行声音合成
    如果系统中装配了支持声卡的DirectSound驱动器,大多数声卡都
支持一定水平的硬件合成。下面的一段小窍门将允许用户尽量使用硬
件合成。
    在进行硬件声音合成时使用静态缓冲区。DirectSound在静态缓
冲中进行声音合成。
    为用得最多的声音文件建立声音缓冲区(可用来进行声音硬件合
成的合成器是有一定限度的)。
    在声音文件运行时,使用方法IDirectSound::GetCaps决定声音加
速硬件支持何种格式并尽可能地采用这些格式(一些声卡只能合成特
定格式的声音文件,例如:SoundBlaster AW32声卡只能合成单16位格
式的声音文件)。
    当要建立静态缓冲区时,需调用CreatSoundBuffer建立从缓冲区,
在结构DSBUFFERDESC的dwFlags区域设定DSBCAPS_STATIC标志。也可
以通过设定  DSBCAPS_LOCHARDWARE标志将缓冲区的数据进行强制性
硬件合成。但是,硬件合成所要使用的资源不可用时,CreatSoundBuff
r 就会出错。
    方法IDirectSound::GetCaps为我们提供了关于声音加速能力的
详尽描述,这对于我们进行存取操作有很大的帮助。我们在其工作时
间内可以调用GetCaps,调整音频系统以最佳方式使用硬件资源。在 D
irectX 文档中查看结构 DSAPS和标志DSCAPS.dwFlags可使我们准确
了解到一些系统的有用信息。

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

    使用延时三维进程命令
    正如前面所述,三维声音将比常规声音花费更多的CPU指令周期。
这是因为在每一个合成周期内,为计算出三维立体声音效果将占用更
多的CPU指令周期。应该尽可能地减少使用三维立体声,最好不要使用
那些并非真正有用的三维声音。这是通过实践得出的。在设计应用程
序时,应该尽早进行尝试,使其更加容易地实现具有或没有三维效果的
声音。也可以调用具有 DS3DMODE_DISABLE标志的方法IDirectSound:
:SetMode,使得三维进程能够在三维缓冲区中运行。
    为了使三维设置的改变对系统运行的影响降低到最小程度,应该
使用延时三维进程命令。这是DirectSound三维声音组件所特有的特
征。为了使用三维延时进程命令,先设定每个三维设置变换(SetPosit
ion、SetVelocity等)中的方法 IDirect3DListener或Direct3DSounB
uffer的dwApply 参数的DS3DMODE_DISABLE标志,并且将所有的这些
变化制成一帧;随后,再调用IDirect3DListener::CommitDeferredSet
tings去执行所有的延时命令,在先前的合成缓冲区中进行重新合成。
1T4总 结
    本文为读者罗列了一系列利用DirectX优化音频媒体的特殊工具
。笔者的建议是:设计支持运行、监视和音量调节的音频子系统。毫
无疑问,必须保证有充足的时间等待程序的运行!如果从一开始就将程
序运行的协调性考虑进去,这个任务将变得更加容易

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店