FMOD最新API—Event Sytem,提供了比FMOD Ex更高层的接口,使引擎开发人员无需关注诸如音频数据管理、播放控制、channels管理等底层细节,而把精力放在考虑如何为上层应用(如:场景/技能/UI编辑器中的音效、音乐的编辑,游戏中各种音效、音乐的播放)设计适合的框架。此外,它还提供了相应的设计工具—FMOD Designer,让音效制作人员既可以很容易地实现各种复杂音效,也能方便地对各种参数(如:3D音效的范围、播放属性)进行设置,最终打包输出事件索引文件(.fev)和音频数据文件(.fsb)给应用程序使用。
FMOD Event System有一些核心概念需要编程者知晓,我抽空对前段时间使用该API时产出的文档(基本上是译文+自己的理解)进行了整理,希望对使用该API的朋友有所帮助。[ P.S. 后面有时间再整理出更为详尽的文档 ]
术语
事件—事件树的叶子节点。获得其句柄后可以播放它,更新它的参数。
事件组—包含事件和子事件组的’文件夹’,用于组织和加载目的。
波形库(wave banks)—被加载的.fsb文件。
事件实例内存(event instance memory)—事件播放所要求的内存。如果在编辑工具中,事件的’max playbacks’属性被设置,FMOD将为对应数量的实例分配足够的内存,以使它们能被同时播放。通常,如果不使用特殊的DSP效果(诸如,反射、回音、和声等),内存的使用是很小的,而且有些DSP效果并不需要内存。
事件层次和波形库的组织
应该将事件划分到多个逻辑组中,便于一起加载和使用,例如关卡音效和公共音效。因此,你可以使用EventGroup::loadEventData加载整个分支,其中占有内存最大的通常是波形库数据。如果事件引用的FSB(即波形库)已经在加载其它事件时载入,绝不会发生重复加载。(注:FSB可以调用预加载函数预先加载到内存)
加载/分配概览
- EventSystem::load加载fev文件,仅分配保存事件树结构对象的小块内存。
- EventGroup::loadEventData从FSB文件加载所有波形数据(需要指定组和其子组)。该函数会递归加载所有子组。
- 如果没有调用Event::loadEventData加载,当用户调用 EventGroup::getEvent/EventGroup::getEventByIndex加载指定事件时,会自动加载其所需的波形数据。
- 如果EventSystem::getGroup/EventGroup::getGroupByIndex的cacheevents参数被置为true,将会为指定组中的所有事件分配事件实例内存(包括DSP特效内存)。这些函数不会递归加载。如果cacheevents参数被置为false,FMOD会等到你调用EventGroup::getEvent/EventGroup::getEventByIndex时分配事件实例内存。
- EventGroup::freeEventData卸载所有波形数据并且释放该组包含的所有事件实例内存(包括子组)。递归释放。
- 如果EventGroup::loadEventData被调用,或者cache了group,EventGroup::getEvent/EventGroup::getEventByIndex不会有任何读盘开销。
一些提示
- 在游戏加载阶段调用EventGroup::loadEventData加载静态波形库(static banks)。
- 如果需要有选择性的加载,不要使用EventGroup::loadEventData,使用EventGroup::getEvent/EventGroup::getEventByIndex,或者使用cacheevents = true调用GetGroup。
- EventGroup::freeEventData会释放组及其包含的子组和孩子相关的所有内存,包括波形库数据和事件实例内存。如果后面又要使用到该组数据,就不得不重新加载。
参考文献
[1] FMOD Ex & Designer Documents