目录

Wwise SDK 2018.1.11
重要迁移说明 2017.1

有了那么多 新功能概述2017.1 “新特性”,您在迁移到 Wwise 2017.1 时注意几件事。

请仔细阅读以下重要迁移说明:

听者现在是游戏对象了

在 Wwise 2017.1 中听者现在是游戏对象了。现在 8 个听者的限制也已不复存在,API 也进行了简化,以删除只在听者上运行的调用——它们现在可在任何游戏对象上运行。在 Wwise 中使用多个听者的游戏需要为每个听者注册一个游戏对象——它们现在对每个听者都会进行完整混音。

Wwise 中的总线现在和游戏对象关联。

总线不再是全局实体,它们可以用类似 Actor-mixer 层级结构中声部的方式进行多次实例化。现在可以在属于混音总线的参数上设置游戏对象范围的 RTPC。但是,要注意到总线一般性设置选项卡中的“声部”参数属于播放声部的游戏对象,而不是总线的游戏对象。

关联到总线实例的游戏对象是由两点结合而决定的:Wwise 工程中的Enable Positioning属性,以及由游戏定义的发声点-听者关联。请参阅 设计工具中的行为或‘Positioning Enabled(已启用定位)’标志已经变更构建 Voice Graph 的算法已更改 了解更多详情。动态信号联通和 3D 定位总线现在在 Wwise 中成为了可能,但是,基本的设置会有不同的声源从一个或更多“发声点”游戏对象进行播放,并且整个混音总线链在另一个游戏对象“听者”上播放。

游戏必须注册一个游戏对象并将听者设置为默认听者(可选择)。

Wwise 不会为你提供游戏对象。想要迁移到 2017.1 并拥有相应的行为,需要在初始化时注册一个游戏对象,并将其设置为默认听者。

AkGameObjectID MY_DEFAULT_LISTENER = 0;
// 注册主要听者。
AK::SoundEngine::RegisterGameObj(MY_DEFAULT_LISTENER, "My Default Listener");
// 将一个听者设置为默认。
AK::SoundEngine::SetDefaultListeners(&MY_DEFAULT_LISTENER, 1);

指派一个游戏对象作为默认听者只是为了方便。这样做就不需要在注册之后的游戏对象后调用 SetListeners()——会有默认听者被自动指派为它们的听者。

请注意,如果您使用 SoundFrame,那么就不需要访问 AK::SoundEngine::SetDefaultListeners API,而是需要直接调用 SetListeners()

在设置辅助发送时,游戏必须指定一个听者

当通过 API 来设置一个游戏定义的发送时,现在需要填写一个附加字段来指定哪个游戏对象将收取这次发送(需要辅助总线 ID 和游戏对象 ID 两者来确定一个混音总线实例)。在设置游戏定义的辅助发送时指定游戏对象也是一种添加发声体-听者关联的方式。这比较类似于 SetListeners() API,它会为主总线输出定义发声体-听者关联(也叫做“干路径”)。

AkGameObjectID myListenerID = 1;
AkGameObjectID myEmitterID = 123;
AkAuxSendValue auxSendVal;
// 必须指定 listenerID。
auxSendVal.listenerID = myListenerID;
auxSendVal.auxBusID = AK::SoundEngine::GetIDFromString(“MyAuxBusName”);
auxSendVal.fControlValue = 1.0f;
AK::SoundEngine::SetGameObjectAuxSendValues(myEmitterID, &auxSendVal, 1);

为了方便,可以把 listenerID 字段设置为 AK_INVALID_GAME_OBJECT,这样就会让声音引擎直接使用那些已用 SetListeners()SetDefaultListeners() API 指定的听者。这个功能有助于代码迁移以及最常见的辅助发送场景,这样可以让听者与直接输出的听者相同。

总线现在可以有辅助发送

在 Wwise 2017.1 中,总线可以辅助发送到其他总线,这打开了信号通路方面的创新大门。就像声部一样,辅助发送可以由用户定义,也可以由游戏定义。当从总线中创建辅助发送时,有几件事需要牢记:

  • 在定义通路时,有可能会造成信号反馈回路。如果出现信号反馈回路,输出会继续,直到通过移除发送来断开回路时终止,并且可能导致输出不稳定。不建议创建导致信号反馈回路的通路。
  • 如果一条总线向一个低于自己层级的另一条总线发送,那么该总线的音频将在下一次音频更新时才完成混音,导致 1 个音频帧的额外延迟。如果出现该情况,Advanced Profiler 中的 Voice Graph 将会显示为红色。
  • 如果一条总线向同一总线层级(如同级总线)进行发送,根据总线在声音引擎中混音的顺序,可能会导致一帧的延迟。声音引擎会尝试解决处理顺序的问题来尽可能降低延迟,但有的情况下这是无法做到的。

设计工具中的行为或‘Positioning Enabled(已启用定位)’标志已经变更

设计工具中的 Enable Positioning(启用定位)标志现在有了一个很重要的目的:它会决定是否要在声部图中该节点处评估当前游戏对象的发声体-听者关联。此外,2D 声像摆位器已脱离 Enable Positioning 标志;现在可以不用定位声音直接进行声像摆位。而且,现在可以有 Positioning Enabled 的 2D 声音了;这意味着我们将会评估发声体-听者关联(下游节点将在别的游戏对象上),但不会进行 3D 空间化。以下是一些 Enable Positioning 标志使用的例子:

  • 在 Actor-Mixer Hierarchy 中的一个声部设置了 Enable Positioning 并且它的 Positioning Type(定位类型) 设置为 3D。该声部将会根据其所在游戏对象的位置被放置于 3D 空间中,并且会在混音到它上游总线之前进行声像摆位和衰减。系统将会为每个关联到该发声体游戏对象的听者游戏对象创建一个上游总线实例。这是当代游戏中的一个典型场景。
  • Actor-Mixer Hierarchy 中的一个声部没有设置 Enable Positioning 标志。那么该声部将会被混音到设置了 Enable Positioning 标志的总线中。在这种情况下,该总线会生成在发声体游戏对象上,该对象和声部的游戏对象是同一个。针对发声体游戏对象的每个听者,都在已启用定位的总线的下游(父级)总线上生成了单独的总线实例。该设置让我们能在 Wwise 中做到 2017.1 之前版本中做不到的事情:在对声音做声像摆位、衰减或空间化之前进行子混音。
  • 设置了 Enable Positioning 标志的总线。也设置了 Enable Positioning 标志的声部混音到该总线中。在这个情境中,我们会进行 2 X 3D 混音——做了空间化的声音在做了子混音之后会再次进行空间化。在该设置中我们有 3 个游戏对象:一个点声源、一个听者、以及一个既是第一个游戏对象的听者,也是后一个听者发声体的游戏对象。这样的设置可以用于模拟声学现象,比如门户。
    Note: 如果您在 Voice Graph 中出乎意料地看到了 Master Audio Bus 的两个实例,那么它很可能表示您在信号链中某处忘了设置 Enable Positioning 标志。

构建 Voice Graph 的算法已更改

在 2017.1 版之前,播放声音时构建的声部图完全由 Wwise 工程指定,游戏能控制的部分非常少。在 Wwise 2017.1 中,声部图基于两点的结合:由 Wwise 工程中的层级所定义的通路,以及游戏中定义的发声体-听者关联。构建声部图的算法可以总结为以下:

  • 当发送一个播放声音的事件后,会生成一个声源,它会与事件指定的游戏对象相关联。
  • 该声源会根据 Enable Positioning(激活定位)’标记连接到声部图:
    • 如果声源的Enable Positioning标记在 Wwise 工程中已设置:
      • 如果它并不存在,那么针对每个已和声源游戏对象相关联的听者,都会生成一个该声源输出总线的实例。该声源会连接到所有这些总线实例。
    • 如果该声源没有激活定位:
      • 如果之前输出总线的实例不存在,那么它会被生成出来,使用同样的游戏对象作为声源。声源会连接到这条总线。
  • 在声部图中一条接一条的总线,都根据Enable Positioning标记连接到它们的父级总线:
    • 如果该总线已设置Enable Positioning标记:
      • 针对与该总线游戏对象相关联的每个听者,都会生成一个该总线父级总线的实例。
    • 如果总线没有设置‘Enable Positioning’标志:
      • 会生成该总线父级总线的一个实例,使用同样的游戏对象作为当前总线。

定义声音通路的规则可能比较复杂。在 Wwise Advanced Profiler 中的新声部图现在会根据游戏对象来对节点进行分组,在针对通路问题进行调试时是极为有用的工具。

AkGameObjectID 现在在所有平台上都是 64 位整数了

为了保持一致性,AkGameObjectID 现在在所有平台上都是 64 位,包括原生 32 位平台。

有效游戏对象 ID 范围已变更

游戏对象 ID 现在可以是任意 64 位无符号整数,范围是从 0 到 0x‭FFFFFFFFFFFFFFDF‬(它是 -33,一个有符号的整数)。游戏对象 ID 范围 0x‭FFFFFFFFFFFFFFE0‬(-32)到 0x‭FFFFFFFFFFFFFFFF (-1) 是保留给内部使用的。transport 游戏对象,由设计工具注册,现在使用的游戏对象 ID 是 0x‭FFFFFFFFFFFFFFFE‬(-2)。

在迁移到 2017.1 时,Profiler 布局中的游戏对象 Watch(监听)和听者 Watch 会重置

随着游戏对象和听者系统的变更,Watch 不再兼容,并将被重置。

插件必须重新构建

使用官方 2017.1 之前版本所构建的插件与 Wwise 2017.1 不兼容。它们需要重新构建。

有些参数不再使用,并且已从 API 中移除。

以下这些标志不再需要,所以它们被移除了。

  • AkPluginInfo::bIsAsynchronous
  • AkFileSystemFlags::bIsFromRSX

移除了触发率的值域限制操作

在 Wwise 2017.1 之前,声音引擎会对 Random 和 Sequence Containers 的 Trigger Rate 的 Transition Time 做值域限制,使这个时间不可能小于 22 ms。我们移除了这一限制来鼓励更有创意的内容。

Universal Windows Platform

Metro 平台重命名为 Universal Windows Platform,并且也支持 Visual Studio 2017。

球坐标在 AkEmitterListenerPair 中不再可用。

不再为所有发声体-听者对进行球坐标的系统计算。因此,它们不再直接从 AkEmitterListenerPair 中可用。Azimuth()Elevation() 属性访问方法已被移除。使用 AkEmitterListenerPair 球坐标的插件和游戏代码将需要调用新服务 AK::IAkGlobalPluginContext->ComputeSphericalCoordinates() 来获取坐标。推荐的方法是使用笛卡尔(Cartesian)坐标和接受笛卡尔变换的 AK::IAkMixerPluginContext::Compute3DPositioning() 的重载。

导入 Tab Delimited(制表符分割)的变更

使用 UseExisting 选项来导入制表符分割文件时的行为已经变更了。和以前一样,如果某处的 Wwise 已经存在,那么它会被重新使用。但是,如果找到了匹配的对象,而且声源的 WAV 文件名不同,那么新的声源将被作为非活动版本导入。

从 Alpha 和 Beta 以来的 WAAPI 变更

  • ak.wwise.core.object.get 中添加了 where 变换。请参阅 transform 了解更多信息。

ak.wwise.core.object.create 中添加了新的 merge 模式。请参阅 理解名称冲突模式 了解更多信息。

  • 添加了对在 ak.wwise.core.object.create 中创建 Virtual Folder(虚拟文件夹)的支持。使用 Folder 类型。请参阅 ak.wwise.core.object.create 了解更多信息。
  • 订阅话题 ak.wwise.core.object.preDelete 重命名为 ak.wwise.core.object.preDeleted。
  • 订阅话题 ak.wwise.core.object.postDelete 被重命名为 ak.wwise.core.object.postDeleted。
  • 添加了对在 ak.wwise.core.object.create 中创建 Events 和 Event Actions 的支持。
  • 添加了查询语言 ak.wwise.core.object.get 的支持。请参阅 ak.wwise.core.object.get 了解更多信息。
  • 添加了对在 ak.wwise.core.object.nameChanged,ak.wwise.core.object.notesChanged,ak.wwise.core.object.created,ak.wwise.core.object.preDeleted, ak.wwise.core.object.postDeleted,ak.wwise.core.object.childAdded,ak.wwise.core.object.childRemoved,ak.wwise.core.object.curveChanged,ak.wwise.core.object.attenuationCurveChanged, ak.wwise.core.object.attenuationCurveLinkChanged 中返回选项的支持。