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

Stella981
• 阅读 823

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
铁扇公主 铁扇公主
1年前
mac专业音频编辑软件推荐:Farrago激活最新版
Farrago是一款音频播放器软件,旨在帮助用户创建、组织和播放各种音频片段、音效和音乐。它提供了一种直观的方式来管理和控制音频资源,适用于多种应用场景。Farrago的主要特点包括:音频片段管理:允许用户导入、保存和组织多个音频片段。用户可以将常用的音频
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这