程序员从 FMOD 转到 Wwise 来,请教事件实例如何管理?

1回答

程序员从 FMOD 转到 Wwise 来,请教事件实例如何管理?

提问者 Audiokinetic 2016-11-20 7.6k浏览
Wwise 的 PostEvent 接口每次调用并没有返回任何音效的实例对象,只是返回结果,那么 Wwise 的底层是不是做了实例的缓存呢?

在 FMOD 里面一个音效就是一个 eventInstance,需要程序来手动实例化,所以我们为了性能优化就需要自己编写并维护一个缓存列表来管理已经实例化的音效。 我刚从 FMOD 转到 Wwise,不知道该怎么写这个缓存列表,但是也不想让音效成为游戏的性能瓶颈,所以有这个疑问。不知道 Wwise 底层是不是已经有一个自己的缓存列表?

如果不使用 Wwise,而是自己编写封装一个实例管理器,有什么需要提醒的吗?感觉不去维护一个缓存列表心里不踏实 ... 

快来消灭0回答吧

{{ dataList.answer_count | view-format }}回答
  • Audiokinetic 2016-11-21 00:02
    事件概念和管理是 Wwise 和 FMOD 不同的地方之一。为了简化程序员的工作并减少程序端手动管理实例所可能带来的稳定性问题,Wwise 不对应用端暴露类似 FMOD event instance 这样的事件实例对象。在程序员通过 PostEvent() API 发送事件之后,Wwise 声音引擎内部会自己维护一个事件队列,在应用主循环内只需调用 AK::SoundEngine::RenderAudio() API,之后引擎便会自行处理这些事件。因为没有暴露实例,所以无需自己封装,请放宽心。
      
    通过引擎来管理事件的“缓存”,这样的做法,大大减少了程序代码量,在发送事件时只需要一行 PostEvent() 调用,既省事也减少应用程序的风险。而反之,试想如果必须手动管理事件实例的生命周期的话,那么至少需要创建和销毁这些实例,因此未经手动封装的代码量保守估计会是 Wwise 做法的三倍,这也会大大增加偶然出错造成的稳定性问题。如果要手动封装并维护缓存,则对应用开发者来说是额外工作,费力且依然会留下稳定性问题。
      
    关于性能,首先 Wwise 的音频渲染对应用很友好,是在自己的线程中异步进行而不会阻塞主线程。另外,这个事件队列的大小可以通过引擎初始化参数 AkInitSettings::uCommandQueueSize 来控制其内存占用,同时也可以通过 Wwise Profiler 来实时观察应用中的实际队列使用情况(如 Command Queue Size,Command Queue Used和 Number of Active Events 等等)以及 CPU 消耗,所以其性能对程序员和设计师都是透明且可控的。


    0评论
  • {{ answer.user.NickName }} {{ answer.profession }} {{ answer.created_at | time-format }}
    专家回答
    {{{ answer.answer }}}
    {{ answer.answer_count | view-format }}评论
加载中... 查看更多回答