Wwise SDK 2024.1.4
|
依据规定限值削减内存用量并不是一件容易的事。以下是帮助降低内存占用的几个技巧:
Object 内存用量直接受内存中加载的声音和 Event 数量以及游戏对象数量影响。它包含工程中用于实现声音设计的行为所必需的对象的所有属性。它还包含所有游戏对象及其相关信息(游戏同步器值、位置、朝向等)。加载的 SoundBank 越多,所需分配的内存就越多。所需的大小完全取决于在一个场景、关卡、地图、游戏区域等中可能播放的声音数量。您可以采用以下做法来减少这些内存分配:
Processing 类别中的内存用于播放声音。它包含用于解压缩、应用效果器和对音频源做混音的缓冲区。它直接受到同时播放的声音数量的影响。它还受到同时使用的效果器数量和类型的影响。为了节省内存,您需要考虑想同时听到多少声音。某些游戏中很少有超过10种声音的场景,而别的游戏的场景中则可能有数百个声音。您需要考虑最坏的情况。
作为参照指南,我们对一些游戏执行了性能分析(在Xbox One 上),并获得了以下数据:
为了降低处理所需的内存用量,您需要减少同时播放的声部数。通过以下方式可以做到这一点:
![]() | 备注: 您还可以对总线也设置限制。 |
![]() | 备注: 您可以在运行时以编程的方式更改音量阈值。您可以在游戏中 CPU 运算更繁重的位置使用此设置,以将更多的声部发送到“低于音量阈值”的状态。 |
SoundBank 占用的内存量几乎都取决于 SoundBank 中的声音数据。控制媒体所占用的内存量可通过以下方式来做到:
Wwise 会使用内部内存池管理部分存续时间不超过一个 Audio Render 时钟周期的临时分配。这些临时分配在 Memory 选项卡的 Advanced Profiler 中显示为 Temp Alloc。它们会存在一段时间、开销很小,由声音引擎在内部进行处理,且无法传给开发者提供的内存分配挂钩。在这当中,Advanced Profiler 和内存分配挂钩只能监控到临时分配所基于的较大内存块。因此,为了更好地优化游戏中的内存用量,最好手动调节 Temp Alloc 内存块的管理。
在 AK::MemoryMgr::Init
过程中,各个 Temp Alloc 类别的内存块的行为由 AkMemSettings::tempAllocSettings
控制。其中包括配置内存块的大小、限定系统至少要分配多少个内存块、规定一个时钟周期积存多少未使用的内存块系统才会释放内存。对此,您可以通过 AK::TempAlloc::GetStats()
来查看在游戏运行时 Temp Alloc 系统使用了多少内存以更好地调节系统的配置。
您可以参照以下建议并根据游戏的具体要求或性能分析期间观察到的其他行为实施调节:
AK::TempAlloc::InitSettings::uMinimumBlockSize
调到默认值以下。这样可以更好地满足游戏在任意给定时间的内存使用需要。AK::TempAlloc::Stats::uPeakMemUsed
以了解 Temp Alloc 系统的内存用量峰值,确保将 AK::TempAlloc::InitSettings::uMinimumBlockCount
设为足够大的值,保证在初始化声音引擎时分配所有可能使用的内存块,之后不再释放。AK::TempAlloc::InitSettings::uMaximumUnusedBlocks
设为较大的值,以确保系统可分配新的内存块,即便在内存负荷较低的时候也不会释放。AK::TempAlloc::InitSettings::uMinimumBlockSize
的值,以确保在使用更多工作线程时不会导致游戏中所用的内存大幅增加。AK::TempAlloc::InitSettings
中有一些调试选项。在声音引擎的 Debug 和 Profile 配置中,默认会启用 AK::TempAlloc::InitSettings::bDebugDetailedStats
和 AK::TempAlloc::InitSettings::bDebugEnableSentinels
,以便优化对用量统计数据的追踪并轻松检测缓冲区溢出情况。在需要最大限度地提升性能或获取尽可能精确的性能分析数据时,请禁用这些选项。在声音引擎的 Release 配置中,已完全取消对这些选项的支持。
Wwise 设有 Bookmark Allocator 系统(与 Temp Alloc 类似),用于处理只存在于单个函数或代码块中的短时内存分配。藉此,Wwise 可以像在堆栈上一样执行临时内存分配。不过,Bookmark Allocator 并不依赖于为线程的堆栈分配足够大的内存来确保处理所有可能的情况,而是使用正常的内存分配来提供必要的资源。
您可以使用 AkMemSettings::bookmarkAllocSettings
来控制 Bookmark Allocator 类别的内存块的行为以便分配和释放底层内存块。另外,还可使用调试设置来检测缓冲区溢出情况,并在使用前后清理分配的内存来设为确定的无效值。同时,通过 AK::BookmarkAlloc::GetStats 获取有关 Bookmark Allocator 使用情况的信息。
您可以参照以下建议并根据游戏的具体要求或性能分析期间观察到的其他行为实施调节:
AK::BookmarkAlloc::Stats::uRecentBlocksFetched
设为较大的值,则在多线程场景下可能会产生过多线程争用情况。为此,最好调高 AK::BookmarkAlloc::InitSettings::uMinimumBlockSize
的值。这样 Bookmark Allocator 所用的内存块会更大一些,也就不需要经常临时请求获取新的内存块了。您可以使用 AK::BookmarkAlloc::Stats::uRecentPeakMemUsed
来确定合理的最小内存块大小。AK::BookmarkAlloc::Stats::uPeakMemUsed
来调低 AK::BookmarkAlloc::InitSettings::uMinimumBlockSize
的值。AK::BookmarkAlloc::InitSettings::uMaximumUnusedBlocks
的值。这样内存的使用情况会更加一致。或者,也可调高 AK::BookmarkAlloc::InitSettings::uMinimumBlockSize
的值。这样作业获取的第一个内存块就够用了。