Cue Sheet加载处理的细节内容
要使用AtomComponent播放音频前,您需要加载Atom Cue Asset和Atom Cue Sheet Asset。
在以下类实现了Atom Cue Asset和Atom Cue Sheet Asset。
  • SoundAtomCue 类 : Atom Cue Asset
  • SoundAtomCueSheet 类 : Atom Cue Sheet Asset

參照Cue Sheet的类

AtomComponent、SoundAtomCue和SoundAtomCueSheet是CRIWARE UE4插件中与音频相关的主要类。 下图显示其参照关系。
criware_ue4_035_primary_atom_object_relation.jpg
如上图所示,主要音频相关对象的参照关系如下。
  • AtomComponent对象参照SoundAtomCue对象
  • SoundAtomCue对象参照SoundAtomCueSheet对象
  • SoundAtomCueSheet对象包含Raw ACB Data。Raw ACB Data是ACB文件内容的副本
  • CRI Core Runtime是用C语言实现的原生库。正确名称为CRI Atom库
  • CRI Core Runtime可以通过加载Raw ACB Data播放ACB中的Cue
请注意以下两个处理的明显区别。
  • 加载Atom Cue Sheet Asset
  • 在Atom Cue Sheet Asset中加载Raw ACB Data

加载Atom Cue Sheet Asset

使用UE4自动加载Asset

Atom Cue Sheet Asset通常以 .uasset 文件的形式打包至应用程序。
如果在关卡上有硬性引用Atom Cue Sheet Asset的对象时, 此.uasset文件将由UE4自动从存储中读取并加载到内存中。
关于Asset引用的用语(硬性引用和软性引用等),请参照Epic Games公司的虚幻引擎4文档。

根据应用程序手动加载Asset

使用UE4完成加载了Asset时,则可以通过调用以下其中一個函数来获取有效USoundAtomCueSheet对象的指针。
  • USoundAtomCueSheet* USoundAtomCueSheet::LoadAcb(FName AcbName, bool bAddToLevel)
  • USoundAtomCueSheet* USoundAtomCueSheet::LoadAtomCueSheet(USoundAtomCueSheet* CueSheet, bool bAddToLevel)
如果沒有使用UE4加载Asset时,则USoundAtomCueSheet::LoadAcb() 函数将搜索指定的Atom Cue Sheet Asset文件 (.uasset) 包, 并将其加载到内存中。 但由于可能涉及文件I/O和巨大内存副本,可能会对性能产生负面影响。
可以使用以下方法避免或检测上述情况:
  • 创建所需的Atom Cue Sheet Asset的硬件引用
  • 创建所需的Atom Cue Sheet Asset的软件引用
  • 使用 异步加载Cue表 的功能
  • 将日志类别名称"LogCriWareRuntime"的日志输出设置为 Verbose(从.uasset加载时输出消息)

加载Asset中的Raw ACB Data

仅加载Asset不可能播放Cue。如上图所示,CRI Core Runtime需要加载Raw ACB Data。
本节将介绍关于加载Raw ACB Data的规格。
从CRIWARE UE4插件Ver.1.27.11.00起,使用CRI Core Runtime加载Raw ACB Data更改为异步运行。

隐式加載

指示AtomComponent播放Cue时,将自动加载所需的Raw ACB Data。本节称之为“隐式加载”。
执行隐式加载时,AtomComponent的执行内容如下。
  1. 确认CRI Core Runtime是否已加载Raw ACB Data
  2. 尚未加载时,将需要在AtomComponent内部加载Raw ACB Data(执行隐式加载)
  3. 执行隐式加载時,AtomComponent状态將显示为EAtomComponentStatus::Prep
  4. 加载完成后,AtomComponent在CRI Core Runtime请求Cue播放
  5. 于实际播放Cue之前会发生时间延迟
  6. 通过CRI Core Runtime开始播放时,AtomComponent的状态转换为EAtomComponentStatus::Playing

显式加载

可以调用以下函数之一来获取有效的USoundAtomCueSheet对象的指针。
  • USoundAtomCueSheet* USoundAtomCueSheet::LoadAcb(FName AcbName, bool bAddToLevel)
  • USoundAtomCueSheet* USoundAtomCueSheet::LoadAtomCueSheet(USoundAtomCueSheet* CueSheet, bool bAddToLevel)
调用上述函数后,返回值的USoundAtomCueSheet指针尚未完成加载Raw ACB Data。
USoundAtomCueSheet提供了FOnLoadCompleted委托作为检测加载完成的方法。
同时,也可以调用USoundAtomCueSheet::IsLoaded() 函数来确认。