Heath's Blog

There is no end, it is just the beginning! - A Game Developer's Notes

FMOD Event System——事件树策略、加载、内存分配

    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会释放组及其包含的子组和孩子相关的所有内存,包括波形库数据和事件实例内存。如果后面又要使用到该组数据,就不得不重新加载。
  • EventGroup::getEvent/EventGroup::getEventByIndex实际返回的是event instance句柄而非真正的指针,"Max playbacks behavior"的设置可能会让前面获得的句柄失效。
  • FMOD Event System并未对SetMute进行优化,使静默状态下的音频消耗降低。

支持多Project加载
  Fmod Event System支持多个fev文件的加载,这有利于大项目支持多个音频制作人员,他们可以自己管理自己的fmod工程。具体做法是调用EventSystem::Load多次,当然资源制作是要有规定的,每个fev文件的root命名不能相同,下面是正确的资源管理方式:



   对于用category来控制音量和静默的处理跟单个fev相同,具有相同category的fev应该会自己合并。

 

 

参考文献

[1]  FMOD Ex & Designer Documents

 

Written by Heath(heath.luo@gmail.com) using Windows Live Writer

posted on 2010-01-18 23:40 Heath 阅读(3811) 评论(0)  编辑 收藏 引用 所属分类: Game Development


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理