在游戏资源紧张或受游戏设计所限的情况下,您必须优化游戏内同时播放的对象。您可以通过以下方法,管理工程内同时播放的各种对象:
限制每个游戏对象可以播放的实例数量,或者对于若干 Actor-Mixer Hierarchy\Interactive Music Hierarchy 对象及子对象,在全局范围内限制其可以播放的实例数量;
限制可通过特定总线的对象总数;或
限制整个游戏中的对象总数。
达到限制后,Wwise 将使用对象的优先级设置,根据达到限制时所设置的行为,决定忽略哪个对象。如果对象具有相同的优先级,那么可以选择忽略最新的实例,还是忽略最早的实例。
当您在 Actor-Mixer 层级或 Interactive Music 层级设置播放数限制时,您可以针对全局或各个游戏对象来控制同一结构能够被播放的实例数量。如果子对象忽略了父级对象的 Playback Limit,则子对象将不再计入父层级的播放数量限制,可播放的实例总数将是它们的限制数量总和。这意味着,如果父对象的限值为 20,子对象启用 Ignore parent 设置且限值为 10,则可播放的实例总数为 30。但是,如果子对象未启用 Ignore parent 设置,则可播放的实例总数与父对象相同,均为 20。如下图所示,无论是否忽略父对象都可以为子对象设置限值。这样,就可以针对特定对象及其子对象的最大实例数,实现精准的回放控制。
在 Master-Mixer 层级中设置播放数限制时,可以指定同时能够通过该总线的声音、音乐或振动的数量。由于各个对象的优先级已经在角色混音器或 Interactive Music 层级上进行了指定,因此总线上不存在播放优先级设置。
在工程/游戏层面上设置播放数限制时,可指定同时处于激活状态的对象数量。各个声音将采用在其 Advanced Settings 中设置的虚声部行为。
设置 Playback Limit 的方法如下:
将对象加载到 Property Editor 中。
切换至 Advanced Settings 选项卡。
在 Play Limit 分组框中,选择 Limit sound instances to 选项。
各播放数限制参数变为可用。
在对应的文本框中,输入每个游戏对象可同时播放的最大数量。
请选择以下选项之一,来定义 Playback Limit 的范围:
Global,针对全局范围应用限制。
Per game object,针对每个游戏对象应用限制。
备注 | |
---|---|
该选项不适用于总线,因为此限制总是适用于全局范围。 |
请选择以下选项之一,来决定达到 Playback Limit 之后的操作:
Kill voice,停止播放具有最低优先级的实例。
Use virtual settings,对声音采用指定的虚声部行为。声音的虚声部行为包括 Continue to play、Kill voice、Send to virtual voice 和 Kill if finite else virtual。
达到 Playback Limit 限值并且有多个对象被赋予最低优先级时,为了明确系统应采取的操作,请从 When priority is equal 列表中选择以下之一:
Discard oldest instance,停止播放具有最低优先级的最早实例。
Discard newest instance,停止播放具有最低优先级的最新实例。
工程/游戏限制可以在 Wwise Project Settings 中针对各个平台修改。也可以在游戏正确初始化引擎后,使用 Wwise SDK API 进行修改。
使用声部限制系统时,最好了解以下几点:
虚声部不会被视为有效声部。
如果声音的虚声部设置为 Continue to play,则可能导致超出限值。
发送到虚声部的声音在返回实声部时(不再是虚声部),一般可以设置为:Play from beginning、Play from elapsed time 或 Resume。但如果选择了 Kill if finite else virtual 选项,则发送到虚声部的声音在返回实声部时将始终采用 Play from elapsed time 设置。
例如,我们假设:
在一条总线上将同时发声上限设置为 4 个,
其 When limit is reached 行为设置为 Use virtual voice settings。
音量阈值设置为 -60 dB。
该总线在一帧中播放了 8 个声部。
声音名称 |
Priority |
Volume |
虚声部行为 |
---|---|---|---|
Sound_1 |
100 |
0 dB |
Go Virtual |
Sound_2 |
90 |
-90 dB |
Go Virtual |
Sound_3 |
80 |
-90 dB |
Continue to play(继续播放) |
Sound_4 |
70 |
0 dB |
Go Virtual |
Sound_5 |
60 |
0 dB |
Kill voice |
Sound_6 |
50 |
0 dB |
Kill voice |
Sound_7 |
40 |
0 dB |
Go Virtual |
Sound_8 |
30 |
0 dB |
Continue to play(继续播放) |
结果是:
声音名称 |
结果 |
原因 |
---|---|---|
Sound_1 |
播放 (1/4) |
最高优先级且高于音量阈值。 |
Sound_2 |
将变为虚拟 |
音量低于阈值。 |
Sound_3 |
播放 (2/4) |
即使低于音量阈值也继续播放。 |
Sound_4 |
播放 (3/4) |
- |
Sound_5 |
播放 (4/4) | - |
Sound_6 |
将被终止 |
超出限制,已有 4 个优先级较高的声音正在播放 |
Sound_7 |
将变为虚拟 |
超出限制,已有 4 个优先级较高的声音正在播放 |
Sound_8 |
播放 (5/4)* |
*即使超出限制但仍播放,这是一种特殊的情形,不允许声音变为虚拟或被终止,且不允许替代 4 个正在播放并且优先级较高的声音。 |
常见问题
问:限制好像不起作用?这是为什么?
答:检查是否未将声音的虚声部行为设置为Continue to play,处于兼容性原因,这是该行为的默认值。超出限制时,使用该设置的任何声音将不会被忽略,也不会被移至虚声部(除非超出限制行为被设置为终止声部)。开始使用 Use virtual voice settings 作为超出限制选项时,必须将所有“可去掉”或“可虚拟化”的声音设置为此选项,以开始节省 CPU。
还请牢记,该限值仅适用于选定对象层级内的声音对象。如果子对象启用了 Ignore Parent 选项,则将不再计入父层级的播放数量限制且不再受父级限制的约束。
问:该限制在大部分时间都起作用,但有时即使没有任何声音被设置为 Continue to play,性能分析显示的值仍超出限制。
答:当声音变为虚声部后,这些声音会在几毫秒内(一个音频帧)保持激活状态,才能淡出并避免出现 clicking。例如,如果限制为 1 且已经播放了一个声音,则另一个声音以较高优先级插入时,有效声音数量暂时变为 2,与此同时第一个声音将淡出,成为虚声部。
问:为什么当超出限制时发送至虚声部不是默认设置?为什么默认情况下所有声音别设置为继续播放?
答:对于虚声部,部分编解码格式可能不精准,可能需要在音频源中添加 Seek Table,才能支持虚声部中 return to physical voice 时的 Play from elapsed time选项。出于这个原因,也为了确保默认情况下正常运行,该设置不作为默认设置。例如,Vorbis 格式需要 Seek Table 才能在 Play from elapsed time 设置下支持虚声部行为。