由于音频渲染(Windows,C++)导致 UDP 通信延迟高

High UDP communication latency because of audio rendering (Windows, C++)

我正在尝试使用带有 WinSocket 库的 UDP 协议以 1 kHz 的频率与外部机器人通信。我正在使用 Windows 10 专业版 21H2。在硬件方面,我使用的电脑是 intel core i9 10900X 32 GB RAM 和 Intel I219。

在某个时候它工作得很好,我确实测量了通信所花费的时间(顺序发送和接收数据包都需要 200 微秒到 500 微秒),我还使用 wireshark 测量了交换的数据包(每秒发送 1000 个数据包,每秒接收 1000 个数据包)。吞吐量发送为2 Mbps,接收为3Mbps。

当呈现任何音频时(即使是在 windows 上更改音量时发生的声音),问题就开始了,这会导致明显的延迟(大约 10 到 15 毫秒)。 当我停止 Windows 音频服务时,这解决了问题,但在我们的应用程序中,我们需要永久渲染声音。

graph : round trip time and frequency vs index of udp query, using NIC PCI

临时解决方案是使用 USB/Ethernet 适配器而不是 NIC。使用这种类型的设备,我们没有延迟,但我们在过去已经遇到过一些与热节流导致的性能下降相关的问题。

graph : round trip time and frequency vs index of udp query, using USB/Ethernet adapter

我也试过降低音频处理的优先级,没有区别。我还尝试在与我的应用程序不同的线程中设置音频服务的关联掩码,两者都没有区别。

我的问题:有没有办法增加音频延迟以便优先处理 udp 通信或减少 udp 通信的延迟以满足我们对 1 kHz 频率的需求。

此问题是由于 Receive Side Throttle 某些 NIC 支持的功能。

为了修复它,您需要设置寄存器变量 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex0xffffffff 并重启 windows。

此注册表项是 Windows OS 的内部私有注册表项,不应公开使用,也不受 Microsoft 官方支持。