版本
menu_open
警告:此页面上某些受保护的信息未予显示。
若为特定平台的授权用户,请确保已登录相应的帐户。
Wwise SDK 2023.1.3
Memory Manager

Wwise 声音引擎的所有模块都通过 AK::MemoryMgr 接口访问内存。声音引擎的客户程序负责此接口的初始化和终止。

SDK 以 静态库 (AkMemoryMgr.lib)的方式提供了一个默认实现。为了使用此库,客户端需要包含 AkModule.h 头文件并调用 AK::MemoryMgr::Init 初始化函数。

请参阅 构建配置 了解有关 AkMemoryMgr.lib 和其它库的使用的更多信息。

初始化

在默认实现中,可使用 AK::MemoryMgr::GetDefaultSettings 获取默认初始化设置。

使用以下设置来限制 Memory Manager(内存管理器)所分配的虚拟内存和设备内存总量:

使用以下设置来启用额外的运行时调试功能:

该不透明值允许自定义实现根据需要定义任意数量的内存调试功能。默认实现提供两个级别。

  • 级别 1 允许使用基础的运行时内存调试功能,包括针对每项分配捕获 FILE 和 __LINE__、针对每项分配追踪调用堆栈、在关机或执行一些细微的完好度检查时详细报告泄漏情况。细微到足以在开发当中默认运行。
  • 级别 2 允许使用 Stomp 分配器,可为每项分配使用离散的虚拟内存页,并设法捕获所有越界写入。该级别的实现非常慢,而且会占用大量资源。因此,建议不要在开发当中默认启用,而只在尝试查明内存 stomp 原因时启用。

使用以下设置将所有分配转储到文件中(注意,此时须将 AkMemSettings::uMemoryDebugLevel 设为 1,并采用非 Release 配置):

注:声音引擎使用 AK::IAkStreamMgr::CreateStd() 打开播放流以供写入。若使用 Stream Manager 的默认实现,则在底层 IO 接口 AK::StreamMgr::IAkLowLevelIOHook::BatchOpen() 的实现中执行文件打开功能。

使用以下设置来监控专门为调试分配的内存池(Release 配置中并不会使用这些内存池):

上述调试函数并不能替代下面的实际分配函数;它们只是针对各个内存分配事件的通知回调。

使用以下设置来通过自定义分配器改写默认实现所用的 rpmalloc:

在设置 AkMemType_Device 位后,上述分配函数必须通过返回设备内存来与该位协调一致。设备内存分配仅适用于部分平台,且必须与特定参数协调一致(详见平台特定章节)。

在 PS5 上,必须返回采用附加标记保护的设备内存页。有关如何在 PS5 上正确实现设备内存分配函数的详细信息,请参阅 内存映射要求 章节。

在 Xbox One 上,必须使用 APU 函数返回所分配的内存页。有关如何在 Xbox One 上正确实现设备内存分配函数的详细信息,请参阅 APU 内存 章节。

在 Xbox Series X 上,必须使用 APU 函数返回所分配的内存页。有关如何在 Xbox Series X 上正确实现设备内存分配函数的详细信息,请参阅 APU 内存 章节。

使用以下设置来改写或控制页面分配机制底层 rpmalloc:

在将自定义分配器配置为改写 rpmalloc 时,不会调用上述函数。设备内存分配仅适用于部分平台,且必须与特定参数协调一致(详见平台特定章节)。若所返回内存的对齐与平台的自然对齐(比如在 Windows 上为 64KB)不一致,则须在 uVMPageSize and uDevicePageSize 中指定该自定义对齐。

在调用了 AK::MemoryMgr::InitForThread() 的线程上,所有小于 uMaxThreadLocalHeapAllocSize 的分配都会转到线程本地内存堆。所有大于该值的分配都会转到全局内存堆并由所有线程共用。uMaxThreadLocalHeapAllocSize 的默认值为 0。因此,在默认情况下,所有分配都会转到全局内存堆。在存在大量多线程 CPU 活动时,对全局内存堆的访问可能会出现严重的争用情况。若出现此情况,请考虑将 uMaxThreadLocalHeapAllocSize 设为 384、512 或更高的值以减少 CPU 争用(代价是会占用更多内存)。

请参阅 示例 了解例程和有关在游戏中初始化内存管理器的更多信息。

有关 SoundBank 内存用量的详细信息,请参阅 加载 SoundBank

有关如何优化内存分配的信息,请参阅 优化内存分配

取代内存管理器

客户端可提供 AK::MemoryMgr 接口的自定义实现。AkMemoryMgr.h 中定义的所有函数全部都要实现。AkModule.h 在 AK::MemoryMgr 命名空间中定义的函数不必实现,因为它们只针对内存管理器的默认实现。

跟在改写 AkMemSettings 的各个分配函数时一样,要想编写新的 AK::MemoryMgr 实现,必须注意在设置 AkMemType_Device 位后通过返回设备内存来与该位协调一致。设备内存分配仅适用于部分平台,且必须与特定参数协调一致(详见平台特定章节)。


此页面对您是否有帮助?

需要技术支持?

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

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

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

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

开始 Wwise 之旅