Wwise SDK 2023.1.6
|
有限的带宽往往会使得存储设备的访问速度成为游戏的瓶颈。因此,为了保持良好的数据传输请求顺序,游戏通常会集中访问 I/O。排序的依据是相对优先级、相对于传输大小的开销要求、吞吐量和延迟。音频一般需要大量的 I/O 资源:音乐和较长的声音在播放时通常从磁盘传输。
Audiokinetic 声音引擎的 I/O 流播放解决方案由自主的、可重写的流管理模块构成。下列流程图展示了该模块及其在声音引擎/游戏架构中的位置:
流管理模块的公共接口在 IAkStreamMgr.h 中定义,供声音引擎和游戏共同使用。前者使用此接口来加载 SoundBank 和流播放音频文件,而后者可用它来加载图形、纹理、游戏关、保存的游戏等。
该公共接口是进行数据传输所用存储(I/O)设备的高层抽象,它独立于平台,将平台底层操作系统或硬件中,文件或其他对象的句柄封装成所谓的“流”。在本文档中,实现流对象和流创建的模块被称为 High-Level Stream Manager,简写为 Stream Manager。
如果需要,您可以完全重写 Stream Manager,但 Wwise SDK 自带了一个默认实现。此默认实现定义了另一个可以将 I/O 相关代码挂钩的层级,称为 Low-Level I/O,使用起来会更便捷。它是将 Wwise I/O 集成到游戏中的首选方式。
Default Streaming Manager Information
默认 Stream Manager 中特定的流播放相关函数和结构(例如 AK::StreamMgr::Create())定义于 SDK include 目录下的 AkStreamMgrModule.h 中。 |
为了在第一次集成 Wwise 时快速入门,请使用 Wwise SDK 随附的默认 Stream Manager 和 Low-Level I/O 示例:
1)链接 AkStreamMgr.lib。
2)Include the default File Location Resolver and I/O Hook into your game's project:
3)After creating the Stream Manager, instantiate and initialize the low-level I/O hook device CAkDefaultIOHookDeferred. Note that you may use CAkFilePackageLowLevelIODeferred instead, which implements the File Package extension of the I/O hook (see next section). 当您需要时,它将准备就绪。请参阅 初始化 Streaming Manager 了解有关如何将其初始化的示例。
4)需要将 Wwise 创作工具生成文件所在的目录告知默认 File Location Resolver (在 CAkFileLocationBase 中实现)。In your code, set the base path where audio assets are deployed, using CAkDefaultIOHookDeferred::SetBasePath() (or CAkDefaultIOHookDeferred::AddBasePath() ). 如果您有本地化语音资源,请使用 AK::StreamMgr::SetCurrentLanguage() 为默认 Stream Manager 模块设置当前语言。默认 File Location Resolver 将语言名称与基本路径组合起来,用于查找本地化资源。
![]() | 警告: 请勿在传输给 AK::StreamMgr::SetCurrentLanguage() 的语言名称后面附加目录分隔符(斜线或反斜线)。 |
声音引擎现在可以加载 SoundBank 并从 SetBasePath()(或AddBasePath())中指定的目录中播放流文件了。 To automatically copy streamed files in the SoundBanks output directory in Wwise Authoring, enable Copy Loose/Streamed Media on the SoundBanks tab in the Wwise Project Settings. See SoundBanks Tabfor more details.
If you instantiated the CAkFilePackageLowLevelIODeferred device, you are a few steps away from being ready to also use file packages. 文件包(*.PCK)是通过将 Wwise 工程中的所有 SoundBank 和流音频文件组合形成单一文件。您还可以将 SoundBank 和流文件分配给不同的文件包。请参阅 File Packager 实用程序文档了解更多详情。
1)在生成 SoundBank 后,将“FilePackager”可执行文件作为生成 SoundBank 的后续步骤,可以让该 Wwise 工具使用 SoundBank 和流文件自动生成文件包(请参见 Wwise 帮助的 SoundBank 设置一节)。
2)In your code, load the file package(s) explicitly using CAkFilePackageLowLevelIODeferred::LoadFilePackage(). LoadFilePackage() 将从 SetBasePath()(或 AddBasePath())中指定的路径打开文件包。In the deployment directory of audio assets, you need to include your file packages, but not the soundbanks and streamed files that they contain. When you load a file package, its header is parsed and a look-up table is created inside CAkFilePackageLowLevelIODeferred. When the sound engine tries to open a file, following a call to AK::SoundEngine::LoadBank() or an event involving playback of a streamed file, CAkFilePackageLowLevelIODeferred searches for it in the look-up tables of all its loaded file packages. 如果未找到,则在基本路径中查找该文件。
CAkDefaultIOHookDeferred reads files using the platform file system API. 如果游戏引擎已包含 I/O 管理器,可能需要将 Wwise Stream Manager 发布的 I/O 读取请求指定至您自己的 I/O 管理器。Edit CAkDefaultIOHookDeferred::BatchRead() to call your I/O manager instead of the platform file system. If necessary, you can also edit CAkDefaultIOHookDeferred::BatchOpen().
SDK 中的默认 Stream Manager 位于 Low-Level I/O 子模块上。 上文所述的类均作为 Low-Level I/O 的示例在 Wwise SDK 中提供。 它们的相关文件位于:默认底层 I/O 实现 。
将 Wwise I/O 集成到游戏引擎中的首选方式,是将 Low-Level I/O 层作为 Wwise I/O 与您的 I/O 管理技术之间的转接口。游戏中的典型 Low-Level I/O 示例种类繁多,从非常简单的示例到极端复杂和高度自定义的示例都有,您可以使用这些示例作为起点。
Low-Level I/O 模块有两个用途:
Stream Manager 的初始化设置将影响它与 Low-Level I/O 系统间的互动方式以及整个 I/O 性能。 Audiokinetic Stream Manager 初始化设置 一章中对此进行了全面描述。I/O 技巧、故障排除和优化 章节讲述了如何对其进行微调。
Stream Manager 的接口在 IAkStreamMgr.h 中定义,Wwise 声音引擎使用 Stream Manager 来读取 SoundBank 和流音频文件。如果还没有 I/O 管理器,也可以将其用于所有游戏 I/O。同样,如果您编写自定义源插件,也可以访问 Stream Manager。
高级 Stream Manager API 说明 一节中详细地解释了它的 API。如果您不将其直接作为客户端,而仅通过实现 Low-Level I/O 挂钩将 Wwise I/O 集成到游戏中,则可以跳过本章。
以下是一些基本概念。Stream Manager 管理两种数据类型的抽象流:标准流和自动流。
Stream Manager 是线程安全的,但只有一个线程可以占用指定流。
主要接口 AK::IAkStreamMgr 可以随时通过调用 AK::IAkStreamMgr::Get() 来访问。随后您将可以创建和使用流对象。
以下章节提供有关流播放的更多详情: