默认内存池包含着与已加载至内存的声音和事件相关的结构元数据。它包含实现 Wwise 中定义的行为所需的工程对象的所有属性。它还包含所有已注册的游戏对象及其相关信息,包括游戏同步器的数值、位置、方向等。由于内存中加载了更多的库以并添加了更多的元数据,因此要求较大的默认内存池。内存池大小最终仅取决于要在一个场景、关卡、地图、游戏区域等播放的声音数量。
注意 | |
---|---|
默认内存池中不包含任何媒体文件。 |
每种声音结构和事件组合平均需要在默认内存池中占用约 300 个字节的内存。例如,如果您的工程包含 50,000 种以上的声音(包括对话),则仅结构数据便需要约 15MB 内存。正如您所看到的,可能无法一次将所有结构加载至内存,因此需要通过与加载和卸载媒体文件同样的方法,来加载和卸载结构数据。
在 Wwise 工程中可以看到,由于加载至内存的声音结构的绝对数量较大,声音结构将占用默认内存池的很大部分(约占25-50% )。当然,加载的声音越少,默认内存池也就越小。第二大内存占用项为事件的元数据,它通常占用 10% 的内存池。事件非常小,因此即使有多个事件,它们也不会占用很大的空间。随机/序列容器结构可能最占用内存的单元,内存占用量约是简单声音的三倍。但由于通常随机/序列容器的数量要比声音或事件少得多,因此整体而言,内存池占用量要更少。
一般情况下,开放世界游戏要求使用较大的内存,因为需要播放更多的声音。这类游戏需要 5 至 8 MB 作为默认内存池。其它类型的游戏的内存占用的低得多,如 2-3 MB。请注意,这些数值仅供您大致了解其它使用 Wwise 的游戏所用的内存量,不保证这样的内存范围也适用于您的游戏设计。
以下经验总结可帮助您减少默认内存池使用的内存:
将包含很多声音结构和事件的大型音频包分割为较小的音频包。根据需要来动态地加载和卸载音频包。确保您的音频包不仅仅根据角色组织,应更多地按情形分类。
使用 ExecuteActionOnEvent API 来减少事件数量。与创建一对播放/停止事件相比,只创建一个播放事件,然后调用 ExecuteActionOnEvent 来停止可以达到同样效果。对于同一播放事件,这种做法同样适用于暂停/恢复。
严格管理您的游戏对象。游戏对象任务完成后,立即取消注册它们。应该避免将很多未使用游戏对象保持激活状态;这样做毫无益处,只会消耗内存。例如,如果一名 NPC 死亡,您则应该取消注册其游戏对象。不要将其重新用于其它对象。需要时,请注册一个全新的游戏对象。一般情况下,如果有上千个游戏对象处于激活状态,可能就太多了。
使用虚拟文件夹来组织声音,而不要用 Actor-Mixer (角色混音器)。虚拟文件夹不占用内存,而角色混音器占用内存。仅当这些对象确实要共用类似的属性(而不使用默认属性)时,才有必要使用角色混音器。此时,使用角色混音器可以节省内存,因为该属性仅出现一次。当然,这还取决于该角色混音器是否被事件引用,如 Set Voice Volume 或 Set Voice Pitch。
尝试减少大型层级结构的大小和复杂性。大型层级结构的常见例子是 Impact 层级结构或 Footstep 层级结构。它带有很多变量,规模可能很大。遗憾的是,它无法分割(媒体可以分割,但结构数据不能)。以下是减小这类层级结构的几种方法:
如果仅需要改变简单属性(为相同的样本设置不同的音量/音高/随机化等),则使用 RTPC。
对于有些 Switch 层级结构或其中的一部分,可以采用 Dialogue Event 和等价的 State Group 来替换。如果变量频繁更改,则这将十分实用。例如,在撞击层级结构中,会撞击哪个表面是无法预先确定的,只有到事件发生时才能知道。您可以使用对白事件和相同名称的状态组来替代切换容器,因为切换容器需要存储切换开关值。而对白事件的优势之一是可轻松复用同一样本或子结构。而且,对白事件不会基于各个游戏对象分配内存。还要记住,您可以将路径指定给一个切换容器,添加另一个层级的变量。
可这样使用的一个例子是脚步声。对白事件可能包含一个或两个状态组,如 Step Type(Walk/Run)和 Surface Type,各条路径均可指定给“Footwear Types”切换容器(开关值为“Boots”、“Civilian shoes”“Barefoot”等)。这是因为“Footwear”在游戏对象的生命周期内不会经常改变,但其它两个变量会经常变化。
该方法的另一个优势是,对白事件可以独立存在于仅有事件的音频包内,而无需关联它所播放的声音结构。这意味着您可将一个事件的复杂声音结构进行分割,置于多个不同的音频包内。以脚步声为例,您可将脚步声对白事件放入 BankEvent 中,将混凝土地面材质相关结构和媒体放入 BankConcrete,将泥土地面材质相关结构和媒体放入 BankDirt,以此类推。这种情况下,您只需根据即将遇到的地表材质类型,动态加载和卸载 SoundBank 即可。
将您的切换容器层级结构分割为多个 SoundBank。将切换容器添加至 SoundBank 时,还会自动包含其所有子分支。但您可以通过 SoundBank Editor 的 Game Syncs 或 Edit 选项卡手动弃用其中某些子分支。假如您有一个 Footstep 层级结构,其中顶层切换开关变量为地表材质类型。如果在游戏中并非一直要求使用所有地表材质类型,您则可以将切换容器层级结构进行切分,置于不同的音频包中,然后根据游戏的条件仅加载所需的表面类型。例如,您可在 Footstep 音频包中包含游戏中随处可见的地表材质(如 Concrete 和 Metal Stairs),在其它随条件变化加载的音频包中,包含仅用于游戏中一个场景或环节的特定地表材质(例如 Mud)。
将用来表现各种声音变化的撞击类型 WAV 文件替换为等价的 SoundSeed Impact。将 10 种不同的 clang(金属碰撞的叮当声)声音替换为 1 种不仅合算,而且可为您带来 10 种以上的变化。不要忽视这种可能性,因为它确实会带来很大改变。