PrepareEvent() 方法只有在绝对需要时才会动态加载媒体。使用此方法时,动作事件元数据必须位于 SoundBank 中,相关媒体文件必须位于文件系统中可访问的位置。相应结构元数据可包含于事件所在的同一 SoundBank 中,也可包含于单独的 SoundBank 中。在使用此方法时,包含动作事件元数据的 SoundBank 使用 LoadBank() 加载并保留在内存中。在动作事件被游戏调用前,声音引擎先 Prepare(预备)这些事件。Prepare 事件时将从文件系统中加载所有被引用的媒体文件,如果所有被引用的结构元数据尚未加载,则还将从 SoundBank 中加载这些结构元数据。当动作事件不再需要时,可将它 Unprepare(解除预备),相应媒体文件于是将从内存中被清除掉。为了将内存占用保持在最低水平并避免内存中出现媒体文件重复,Wwise 在加载媒体文件前会先确认它不存在于内存中。
备注 | |
---|---|
只有动作 Event 可事先 Prepare。"PrepareEvent()"方法不适用于对话事件。 |
下图说明如何事先 Preapre Event,以便只将必需的媒体文件加载到内存中。
当元数据(又称结构)未存储在 Event 所在的同一 SoundBank 时,Wwise 需要一种方法来找到位于另一 SoundBank 中的相应数据。为此,Wwise 加入了对其它 SoundBanks 中存储的相应内容的引用。Wwise 可以使用名称或 ID 来引用其它 SoundBank。要在声音引擎中使用 SoundBank 名称,必须在 Project Setting 对话框的 SoundBank 选项卡上选择 Use SoundBank Names 选项。要使用 ID,则取消勾选该选项。有关详细信息,请参阅“SoundBanks 选项卡”一节。
被 SoundBank 引用的媒体必须作为松散文件存储在磁盘中,否则必须能够被底层 IO(Low-Level IO)解析(例如在 File Package 中)。
此方法在内存利用方面总体来说非常高效,但需要额外执行磁盘寻址。在已经通过磁盘流传输大量文件时,这种方法可能不太合适。另外,在游戏使用了 State 和 Switch 的情况下,不需要的媒体文件可能会被白白加载到内存中。例如,您针对游戏中人群的不同情绪或能量级别设置了不同的人群声音,如果游戏的特定区域中只有“愤怒“ Switch 声音有效时,则所有级别的人群声还是都会被加载到内存中来,而这样您是不会愿意的。为了克服这一问题,您还可以 Prepare 特定的 State 或 Switch,只加载与 Prepare 的 State 或 Switch 相关的媒体文件。
下图显示了如何提前 Prepare Switch,以进一步限制在游戏任何特定时刻加载到内存中的媒体量。
虽然提前 Prepare Game Sync 可以优化内存占用,但注意,这也会降低媒体加载到内存中的速度。读取时间延长是因为声音引擎需要搜索磁盘,以查找与 Prepare 的 Game Sync 相对应的声音。
通过动态地只加载必需的音频文件,第二种方法可以为您处理以下情况提供更大的灵活性:处理具有大量声音的超大区域或关卡,或者以非常有限的内存量来存储事件数据、结构数据和媒体。
您可以看到,每种方法各有长短。最佳方式取决于游戏的特定场景、要求和限制。在确定策略后(使用一种方法还是同时使用多种方法),您可以开始相应地填充和优化您的 SoundBank。
备注 | |
---|---|
LoadBank、AkBankContent_All、PrepareEvent、PrepareGameSyncs 和 AkBankContent_StructureOnly 函数均可通过 Wwise API 访问。有关加载 SoundBank 和 Prepare 事件或 Game Sync 的详细信息,请参阅 Wwise SDK 的《集成 SoundBanks》一节。 |
有关可用于管理 SoundBank 的不同方法的详细概述,请参阅“SoundBank 的管理策略”一节。