menu
版本
2024.1.1.8691
2024.1.1.8691
2023.1.9.8628
2022.1.18.8567
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
2024.1.1.8691
2023.1.9.8628
2022.1.18.8567
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 )。