版本

menu_open

默认内存池

Default memory pool(默认内存池)包含内存中所加载声音和事件的结构元数据,也包含 Wwise 中各行为所需工程对象的所有属性。它还包含所有注册的游戏对象及其相关信息,包括 Game Sync(游戏同步器)值、位置、方向等。当内存中加载的库越多,元数据也越多,这就需要更大的默认内存池。这个大小最终取决于同时播放声音数量最多的情况,可以是在一个场景、关卡、地图、游戏区域等。

[注意] 注意

默认内存池中不包含媒体文件。

每个声音结构和事件组合平均占用默认内存池中约 300 字节的内存。例如,如果您的工程包含 50,000 个以上的声音(包括对话),那么仅结构数据就要占用 15MB 内存。可以想见,一次将其全部加载至内存不太可行,因此需要跟处理媒体文件相同的方法来加载和卸载结构数据。

在 Wwise 工程中可以看到,内存中声音 Structure(结构)的绝对数量较大,所以将占用默认内存池的很大部分(约占25-50% )。当然,加载的声音越少,默认内存池也就越小。第二大占用项为 Event(事件)的元数据,它通常占用默认内存池的 10% 。事件非常小,即使有多个事件也不会占用很大的空间。Random/Sequence Container(随机/序列容器)结构可能是最占用内存的,占用量约是简单声音的三倍。但通常 Random/Sequence Container 的数量要比声音或事件少得多,因此整体而言占用量要更少。

一般情况下,开放世界游戏需要播放更多的声音,因此要求更多内存,默认内存池需要 5-8 MB。其它类型游戏的内存占用会低得多,如 2-3 MB。请注意,这些数值仅供大致了解使用 Wwise 的其它游戏所用的内存量,不保证也适用于您的游戏设计。

以下经验总结可以帮您减少默认内存池占用:

  • 对于包含很多声音结构和事件的大型 SoundBank(音频包),可以将其拆分成较小的音频包,并根据需要动态地加载和卸载音频包。请确保您的音频包不仅仅根据角色组织,而要更多地按情景分类。

  • 可以使用 ExecuteActionOnEvent API 来减少事件数量。与创建一对 Play/Stop Event(播放/停止事件)相比,只创建播放事件,然后调用 ExecuteActionOnEvent 来停止可以达到同样效果,Pause/Resume(暂停/恢复)也同样适用。

  • 严格管理您的游戏对象。游戏对象完成任务后,请立即 Unregister(取消注册)它们。要避免让冗余游戏对象处于激活状态;这样毫无益处,只会消耗内存。例如,如果一名 NPC 死亡,应该取消注册其游戏对象,不要将其重新用于其它对象,需要时请注册一个全新的游戏对象。一般情况下,如果有上千个游戏对象处于激活状态,可能就太多了。

  • 使用 Virtual Folder(虚拟文件夹)来组织声音,而不要用 Actor-Mixer (角色混音器)。Virtual Folder 不占用内存,而 Actor-Mixer 会占用。仅当一组对象确实要共享属性值(默认值除外)时,才有必要使用 Actor-Mixer。这种情况下 Actor-Mixer 可以节省内存,因为该属性仅在一处生效。当然,这还取决于 Actor-Mixer 是否被事件引用,如 Set Voice Volume(设置音量值)或 Set Voice Pitch(设置音高值)。

  • 请尝试减少大型层级结构的大小和复杂程度。大型层级结构的常见例子是 Impact(撞击声)层级结构或 Footstep(脚步声)层级结构,变量很多,规模也可能很大。遗憾的是,它无法拆分(媒体可以拆分,但结构数据不能)。以下方法可以简化大型层级结构:

    • 如果仅需改变简单属性(为相同的样本设置不同的音量/音高/随机化等),则使用 RTPC,而不要复制声音结构。

    • 可以用 Dialogue Event(对白事件)和等价的 State Group(状态组)来替换某些 Switch(切换开关)层级结构,或其中的一部分。如果变量频繁更改,这将很实用。例如,撞击声层级结构中,撞到哪个表面无法预先确定,只有到事件发生时才能知道。可以使用 Dialogue Event 和相同名称的 State Group 来替代 Switch Container(切换容器)。因为切换容器基于切换开关值,而 Dialogue Event 的优势之一是能轻松复用样本或子结构。而且,Dialogue Event 不会为每个游戏对象分配内存。还要记住,您可以将 Switch Container 指派给 Path(路径),从而进一步增加变量维度。

    • 以脚步声为例,Dialogue Event 可以有两个状态组,如 Step Type(脚步类型,如走路/跑动)和 Surface Type(地表类型),各条路径均可指定给“Footwear Types”切换容器(鞋子类型,开关值包括“Boots(靴子)”、“Civilian shoes(平底鞋)”“Barefoot(赤足)”等)。这是因为“Footwear”在游戏对象存在周期内不会频繁改变,但其它两个变量会经常变化。

    • 该方法的另一个优势是,Dialogue Event 可以独立存在于仅有事件的音频包内,而无需关联要播放的声音结构。就是说,您可以将事件中的复杂声音结构进行拆分,置于多个音频包内。以脚步声为例,可以将 Dialogue 放入 BankEvent 音频包中,将混凝土地面材质相关的结构和媒体放入 BankConcrete 音频包,泥土地面材质相关的结构和媒体放入 BankDirt,以此类推。这种情况下,只需根据即将遇到的地表材质类型,动态加载和卸载音频包即可。

    • 将 Switch Container 层级结构拆分为多个 SoundBank。将 Switch Container 添加至 SoundBank 时,会自动包含其所有子分支。但您可以通过 SoundBank Editor(音频包编辑器)的 Game Syncs(游戏同步器)或 Edit(编辑)选项卡,手动排除某些子分支。假如有一个 Footstep 层级结构,其中顶层 Switch 变量为地表材质类型。如果游戏中并不会一直出现所有地表材质类型,就可以将 Switch Container 层级结构拆分并置于不同的 SoundBank 中,然后根据游戏情况,仅加载所需的表面类型。例如,您可在“Footstep”SoundBank 中包含游戏内随处可见的地表材质(如水泥 Concrete 和金属阶梯 Metal Stairs),而对于游戏中某个场景或环节的特定地表材质(例如泥地 Mud),则置于其它动态加载的 SoundBank 中。

对于撞击类的各种不同声音,可以将 WAV 文件替换为等价的 SoundSeed Impact 插件。将 10 个不同的 Clang(金属碰撞的叮当声)声音替换为 1 个不仅合算,而且还能带来 10 种以上的变化。不要忽视这种可能性,因为它确实很有效。


此页面对您是否有帮助?

需要技术支持?

仍有疑问?或者问题?需要更多信息?欢迎联系我们,我们可以提供帮助!

查看我们的“技术支持”页面

介绍一下自己的项目。我们会竭力为您提供帮助。

来注册自己的项目,我们帮您快速入门,不带任何附加条件!

开始 Wwise 之旅