【问题标题】:DirectInput8 EnumDevices sometimes painfully slowDirectInput8 EnumDevices 有时非常缓慢
【发布时间】:2012-06-13 15:09:22
【问题描述】:

有时(在大约 50% 的运行中),EnumDevices 需要 5-10 秒才能返回。通常它几乎是即时的。我找不到任何关于此类行为的其他报告。

当事情变得如此缓慢时,可以通过观看 stdout 来分析 :) 这个:

std::cout << "A";
directInput8Interface->EnumDevices(DI8DEVCLASS_GAMECTRL, MyCallback, NULL, DIEDFL_ATTACHEDONLY);
std::cout << "C";

...

BOOL CALLBACK MyCallback(LPCDIDEVICEINSTANCE, LPVOID)
{
    std::cout << "B";
    return DIENUM_CONTINUE;
}

似乎通过枚举设备挂在一个随机点 - 有时它会在回调被调用之前,有时在几个之后,有时它会在最后一次调用它之后。

这显然是一段简化的代码;我实际上使用的是 OIS 输入库 (http://sourceforge.net/projects/wgois/),因此有关上下文,请在此处查看完整源代码:

http://wgois.svn.sourceforge.net/viewvc/wgois/ois/trunk/src/win32/Win32InputManager.cpp?revision=39&view=markup

虽然那里似乎没有什么特别的果味,但可能是它们初始化中的某些原因 - 我对 DI8 了解不足,无法发现它。

任何关于为什么它会这么慢的想法将不胜感激!

编辑:

我设法在 etl 跟踪文件中发现了问题,并在 Windows 性能分析器中对其进行了分析。看起来EnumDevices 最终调用到DInput8.dll!fGetProductStringFromDevice,它调用HIDUSB.SYS!HumCallUSB,它调用KeWaitForSingleObject 并等待。 10 次中有 9 次(字面意思 - 跟踪中有 10 个样本)这会很快返回(每个 324us),准备好的调用堆栈包含 usbport.sys!USBPORT_Core_iCompleteDoneTransfer 后跟 HIDUSB.SYS!HumCallUsbComplete,看起来很正常。

但是 10 次中有 1 次,这几乎需要 5 秒才能返回。在准备好的调用堆栈上是 ntkrnlmp.exe!KiTimerExpiration 而不是 HIDUSB.SYS 函数。我猜这一切都表明 HIDUSB.SYS 驱动程序正在以 5 秒的超时时间异步查询设备,有时它会失败并达到此超时时间。

我不知道此故障是否与任何特定设备相关(我确实有一些 USB HID)或者它是否是随机的 - 很难测试,因为它并不总是发生。同样,任何人都可以给我的任何信息都将不胜感激,尽管鉴于 DirectInput 的奇怪情况,我不希望 Microsoft 很快解决这个问题!

也许我只需要提前开始异步初始化输入,并接受有时在用户输入发生之前会有 5 秒的延迟。

【问题讨论】:

    标签: c++ wait directinput


    【解决方案1】:

    我也遇到过这个问题,主要是作为最终用户,但多年来我一直很烦。直到我在一个开源项目中遇到它并能够调试它时,我才意识到这是这个问题。

    原来是我的 USB 耳机 DAC(Massdrop 的 Objective DAC),它安装了驱动程序:wdma_usb.inf_amd64_134cb113911feba4\wdma_usb.inf for Device Instance ID USB\VID_262A&amp;PID_1048&amp;MI_01\7&amp;F217D4F&amp;0&amp;0001,然后在设备管理器中的声音、视频和游戏控制器下显示为: ODAC-revB USB DAC,在人机接口设备下为:USB Input DeviceHID-compliant consumer control device

    我不知道 HID 条目的作用,但是...当它们被启用并且这个 DAC 被设置为音频输出设备时,IDirectInput8_CreateDevice 和 EnumDevices 都非常缓慢。禁用“USB 输入设备”条目似乎不会造成负面影响,完全解决了我的问题。

    将 DAC 的音频输出更改为其他任何东西也奇怪地解决了这个问题。

    这太糟糕了,以至于游戏手柄配置对话框 joy.cpl 无法使用、挂起并最终崩溃。

    我希望这只是一个评论,但我没有足够的代表,这几乎是互联网上唯一描述此问题的地方,但希望有一天这对其他人有所帮助!

    【讨论】:

    • 非常有趣!谢谢!我从来没有深入了解这一点,也从未在任何其他机器上发生过它,所以我认为它是行为不良的设备或其他东西,你的报告也表明了这一点!很高兴知道我不是唯一受到影响的人!
    • 更新:有时它会安装不同的 wdma_usb.inf 驱动程序,这也会有同样的问题。不过,我的新 PC 上不再出现此问题。旧的机器是 Intel Haswell 机器。
    • 你是救世主。我有这个问题将近 10 年。禁用几个不起眼的“USB 输入设备”条目,问题就消失了,10 秒到 200 毫秒。虽然我会添加所有显示“input.inf”的设备;没有人与“wdma”有任何关系。我也有一个 Objective DAC(在它坏掉之前),但不是来自 Massdrop。我认为 JDS Labs 现在出售它们的一些较新版本,据说损坏的频率较低:blog.jdslabs.com/2015/05/releasing-odac-revb 我会尝试把它扔给他们,也许我们会学到一些有趣的东西。
    • 一些额外的阅读,以便我们可以将所有这些信息链接回彼此:github.com/godotengine/godot/issues/20566github.com/pygame/pygame/issues/2173
    【解决方案2】:

    我有同样的问题。我有一个 Corsair K65 LUX RGB 键盘。我更新了 CUE,它似乎已经解决了这个问题

    【讨论】:

      【解决方案3】:

      在使用我的 Corsair K55 键盘时遇到了同样的问题。更改 USB 端口的键盘可以暂时解决此问题,但稍后又会出现问题。所以这似乎是一个错误的驱动程序问题。

      【讨论】:

      • 有趣,我遇到了同样的问题,目前使用的是 Corsair K66 键盘。
      【解决方案4】:

      作为DaFox has pointed out,一个可能的原因似乎是启用了某些设备驱动程序。我联系了JDS Labs 支持人员(他们出售了一台恰好安装了这样一个驱动程序的设备),他们亲切地指出根本原因实际上是 Windows 中的一个错误(不是已安装的驱动程序),他们实际上提供了解决方案 on their troubleshooting page .请参阅Games hang or experience loading delays,其中明确提到了VID_262。禁用此驱动程序可修复问题而不会产生明显的副作用(在这是唯一触发错误的驱动程序的情况下)。至于 Windows 究竟出了什么问题,这里有龙。

      所以我想(针对用户的)首选解决方案是为您曾经连接到系统的所有设备抓取所有故障排除和常见问题解答页面,看看是否提到了由驱动程序引起的延迟/滞后.

      作为一名软件开发人员,您可能希望对受影响代码的执行时间进行基准测试,并善意地告诉用户他们的系统配置有问题,以及在哪里寻找如何修复它以防它过长。

      【讨论】:

        【解决方案5】:

        Corsair K70 键盘存在相同问题。 快速重新连接键盘可以解决此问题,直到下一次。通常在某些 DirectInput 设备从系统中移除或进入睡眠状态后发生。

        【讨论】:

          【解决方案6】:

          多年来,这一直困扰着我作为开发人员和我的朋友作为用户。所有使用 DInput、SDL SDL_INIT_JOYSTICK 或任何依赖于它的游戏的初始化时间都非常长。

          这是由 DAC 的驱动程序错误引起的,正如 DaFox 所指出的,禁用相应的 USB 输入设备解决了该问题。尽管它标有不同的制造商名称,但供应商 ID 匹配。

          设备的硬件ID是USB\VID_262A&amp;PID_9023&amp;REV_0001&amp;MI_00

          【讨论】:

            【解决方案7】:

            Steelseries Apex 7 键盘似乎也出现了同样的问题。在枚举 USB 设备时,再次拔出并重新插入该键盘可以消除 3 次冻结(每次 10 秒)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-24
              • 1970-01-01
              • 2023-01-24
              • 2021-11-11
              • 2019-08-11
              • 2010-10-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多