FMOD翻译下术语

因为要写个游戏内使用的关于声音的东西,因为对于RPG来说,声音带来的沉浸感是相当重要的,所以这里看下FMOD的帮助文档中关于一些术语的东西,看着金山词霸翻一下记录下,仅作参考。

Samples ,bytes, milliseconds
在FMOD中你需要知道这几个东西:PCM samples(PCM采样), bytes(字节),milliseconds(毫秒);

通过下面这个图可以了解下这些数据在FMOD buffer里面的保存3e5699ab4cf41a3db4d60&amp

L表示左,R表示右,一左一右交叉排列,就是一个立体的声音了。
一对L/R(一个声音(sound)分两个频道(channel))就称作sample
因为这是由16位的数据组成的,所以 1 sample = 4 bytes;
做过采样频率(sample rate)或回放频率(playbackrate)是44.1khz,或44100样本(sample)每秒,则
1 sample 是一秒的 1/44100,或 一毫秒的 1/44.所以:44100 samples = 1s 或 1000ms价值的数据

各种单位之间的换算公式如下:
3e5699ab4cf418f845df9&amp
这都不用记住,Sound::getLength就可以获取你想要的单位。
(关于一些名词的理解,可以看下这个,当然也是E文的:http://www.ypass.net/blog/2010/01/pcm-audio-part-1-what-is-pcm/)

Sounds. Samples , compressedsamples, streams
当一个声音被载入,不管他是未解压的还是静态的sample都原原本本的载入到内存中并即时解压,或如果是流(应该是相对于sample而言的)就一段数据一段数据地进行实时解码,这个解码过程是在外部介质中的比如硬盘或CD。

*”Samples”非常适合于比较小又需要播放不止一次的声音,比如声音特效。它们重播通常只使用很少甚至不使用CPU,并且可以使用硬件加速。可以查看FMOD_CREATESAMPLE
*”Streams”适合于比较大的声音,大到以至于不能放到内存里的,或需要使用FMOD管理器的一个小的ringBuffer。基于文件格式则需要占用不同CPU及光盘带宽。比如mp3,就需要使用比较高的CPU占用用来实时解码操作,而未压缩的wav格式就占用少得多了。一个流声音(streamsound)只能被播放一次,因为在每个流同一时间只能有一个文件句柄,并且只能有一个ringbuffer用于解码。可以查看FMOD_CREATESTREAM
*”compressedsamples”是一种比较新的高级的选择,可以允许用户加载一些经过压缩的文件格式(比如IMAADPCM,MP2,MP3,XMA),并且他们在内存也是压缩状态而不会解压他们。他们对于CPU来说是软件混合(softwaremix)并且是没有”只能一次”限制的流。比标准的PCMsample更占用CPU,但却是比流占用的更少,因为不需要频繁的光盘访问以及许多小的内存buffer.可以查看FMOD_CREATECOMPRESSEDSAMPLE

你也许特别在意”Sample”与”Stream”的定义,但实际上没有类来表示他们,因为在FMOD中使用一个统一的管理类:Sound.
默认的,使用 System::createSound 是想要将整个声音解码到内存中(可以理解为一个未压缩的sample).
要实时使用流并节省内存,可以在createSound时使用 FMOD_CREATESTREAM标签,或使用System::createStream,两种方法本质上是一样的。
要使用压缩的sample,在createSound时使用FMOD_CREATECOMPRESSEDSAMPLE.

Hardware, Software
FMOD支持硬件加速,通过DirectSound或控制台硬件API,但FMOD也有他自己的一套软件混合(softwaremix)机制
注意:只有拥有一块符合规范的声卡的windows系统,以及ps2,psp,will才支持FOMD_HARDWARE。

硬件声音(用FMOD_HARDWARE创建)可以拥有较低的CPU占用等等,但也有一些限制,比如windows的DirectSound的一些限制。
软件声音(用FMOD_SOFTWARE创建),通常会需要高的CPU占用,但不会经常,比如复杂的循环,实时分析,sample精确同步等。
(下面列了两种方式的特点,不翻译了。。。一般用默认的硬件就可以吧。。)

Channels and sounds
当你加载了你的声音,下面当时是要播放他们。播放可以使用 System::playSound,这个函数返回个指向Channel指针或FMOD_CHANNEL句柄。这个函数的index参数通常建议经常使用FMOD_CHANNEL_FREE,这表示FMOD将选择一个不在播放中的Channel给你使用。

2D,3D
一个3D源的意思是一个channel有一个位置(position)与速率(velocity).当一个3DChannel播放时的音量,speaker的摆放位置、朝向等都会影响到听者(listener)的效果。
listener可以是播放者,或者是游戏的摄像头。他有一个位置,像声音源的速率,但是他还有一个方向(orientation)。

听者与源之间的距离决定了音量的大小。
听者与源之间的相对速率决定了pitch(多普勒效应)
听者的对于源的方向(orientation)决定了speaker的安置

一个2D声音就简单了,不会有听者的概念,也不会有多普勒效应等等。
2D声音可以调用 Channel:: setSpeakerMix, Channel::setSpeakerLevels或Channel:: setPan,这些3D声音不能调用。
3D声音可以调用任何包含”
3D”的函数。

发表评论

邮箱地址不会被公开。 必填项已用*标注

* Copy This Password *

* Type Or Paste Password Here *