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 的管理策略。