【问题标题】:High UDP communication latency because of audio rendering (Windows, C++)由于音频渲染(Windows、C++)导致的高 UDP 通信延迟
【发布时间】:2022-01-14 22:11:29
【问题描述】:

我正在尝试使用带有 WinSocket 库的 UDP 协议以 1 kHz 与外部机器人通信。我正在使用 Windows 10 专业版 21H2。在硬件方面,我使用的是带有英特尔酷睿 i9 10900X 32 GB RAM 和英特尔 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/以太网适配器而不是 NIC。使用这种类型的设备,我们没有延迟,但我们过去已经遇到过一些与热节流导致的性能下降相关的问题。

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

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

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

【问题讨论】:

  • 您使用的是哪种网卡?一个好的 PCI NIC 应该很容易胜过 USB/以太网加密狗。应该是驱动问题。机器人是如何连接的?以太网铜线?
  • 我确实尝试了许多网卡 intel I219 芯片组(集成在主板中)intel gigabyte on PCI、intel Killer 和两个 realtek。所有这些 NIC 在没有 Windows 呈现的音频声音时都表现出色,但是一旦我播放任何类型的声音,USB 就会继续工作,但 PCI 上的所有 NIC 都有明显的延迟。这里有两个因素:延迟和吞吐量。也许使用 PCI 接口可以提高吞吐量,但在我的情况下,我更关心音频渲染引起的延迟
  • 对不起,我忘了说电脑和机器人实际上是使用铜质以太网电缆连接的,中间没有路由器。
  • 您能否通过使用 TCP/IP ping 重现延迟问题?最终尝试来自 Microsoft 的 PsPing。
  • 这并不容易,因为延迟不是永久性的。

标签: windows audio network-programming udp latency


【解决方案1】:

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

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

此注册表项是私有的并且是 Windows 操作系统内部的,它不应该被公开使用,并且不受 Microsoft 官方支持。

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多