FMOD Event System——事件树策略、加载、内存分配
2016-06-20 00:00
302 查看
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
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
相关文章推荐
- 解决Windows 8系统假死的方法
- Lua 5.0 参考手册
- 项目经理成长日记(4)——态度决定一切
- D3D中的Alpha融合技术(1)
- 去掉搜索引擎中的Powered By Dvbbs.net (动网论坛)
- [zz]Objective-C 内存管理精髓
- OGame殖民
- 一个程序员的成长的六个阶段
- Windows环境下Unicode编程总结
- Nebula3资源子系统
- 微软Windows 7 SP1 RC 官方已经提供下载
- VS2005 sp1 集成光盘日志
- 中国1949年后称帝的皇帝
- 程序员的灯下黑:“逗到底”的程序员
- Windows服务编写原理及探讨(三)
- 三维体系、点、矢量
- 组装电脑的五大注意点
- 涉及到的jstring 到CString 的转换和其他一些东西
- 让UltraEdit 支持Lua的语法高亮显示
- VC2005开发移动程序的小问题