menu
版本
2024.1.5.8803
2024.1.5.8803
2023.1.13.8732
2022.1.19.8584
2021.1.14.8108
2019.2.15.7667
2019.1.11.7296
2018.1.11.6987
2017.2.10.6745
2017.1.9.6501
2016.2.6.6153
2015.1.9.5624
menu
2024.1.5.8803
2023.1.13.8732
2022.1.19.8584
2021.1.14.8108
2019.2.15.7667
2019.1.11.7296
2018.1.11.6987
2017.2.10.6745
2017.1.9.6501
2016.2.6.6153
2015.1.9.5624
“音频命令队列已满,调用程序被阻止。请减少声音引擎调用或增大命令队列内存”。音频命令队列是一种将所有 API 调用从游戏传递至内部声音引擎的机制。在 Performance Monitor(性能监控器)视图中,可监控此内存缓冲区。在此缓冲区装满命令后,将暂时阻止游戏线程继续添加其他命令。这样做是为了避免因 API 调用丢失而导致游戏和声音引擎之间出现同步问题。不过这可能会造成游戏帧率出现短暂的下降。
可能的原因:
单个游戏帧中的 API 执行的调用太多。这是报告此错误时最常见的原因。该问题通常是由 SetPosition
、 SetRTPCValue
、 SetSwitch
等函数的冗余调用造成的。此外,若在启动实际游戏进程之前设置关卡、创建大量 Game Object(游戏对象)、设置位置和 RTPC,也会出现此问题。
所执行的 API 调用包含大量参数数组,需要占用很大内存(如 SetMultiplePositions
或 Spatial Audio 几何构造调用)。
音频处理线程非常繁忙,导致无法处理命令。在这种情况下,会同时出现 Voice Starvation(声部匮乏)错误。
音频处理线程被阻止或锁死。这表示游戏或 Wwise 出现了问题。
推荐的解决步骤:
分析游戏执行的 API 调用:打开 Profiler Settings (Alt-G),并启用 API Calls(API 调用)。这样可以识别哪个游戏进程在向队列大量输送 API 调用。
检查游戏中 Wwise 的 Game Sync(游戏同步器)更新方式,包括 State(状态)、Switch(切换开关)、Game Parameter(游戏参数)。仅在必要时更新这些参数。
在游戏帧内添加 AK::SoundEngine::RenderAudio
调用,以便将游戏帧拆分为多个音频帧。RenderAudio 只作为同一游戏帧内一系列 API 调用的结束位置标记。它会触发音频命令队列处理,并更新内部声音引擎状态。但是,该函数调用并不会渲染实际的音频。
确保音频处理线程拥有足够高的 CPU 处理优先级(线程名为 AK::EventMgrThread
,其优先级由 AkPlatformInitSettings::threadLEngine
设定)。若是因此造成的问题,则游戏会同时出现大量 Voice Starvation 错误。
将调试器连接至游戏,并确认线程(即 AK::EventMgrThread
)确实在运行。若未运行,则表示游戏已丢失所有声音。出现此问题时,请联系 Audiokinetic 技术支持部门。
增大命令队列内存(请参阅 AkInitSettings::uCommandQueueSize )。