7

有时(在大约 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最终调用 to 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 的奇怪情况,我不希望微软很快解决这个问题!

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

4

7 回答 7

7

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

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

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

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

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

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

于 2016-11-06T13:07:23.140 回答
3

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

于 2018-09-10T01:09:24.483 回答
1

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

于 2017-12-23T11:49:18.423 回答
1

正如DaFox 所指出的,一个可能的原因似乎是启用了某些设备驱动程序。我联系了JDS Labs支持(他们销售的设备恰好安装了一个这样的驱动程序),他们亲切地指出根本原因实际上是 Windows 中的一个错误(而不是安装的驱动程序),他们实际上在他们的故障排除页面上提供了解决方案. 见Games hang or experience loading delays,其中明确提到VID_262。禁用此驱动程序可以解决问题而不会产生明显的副作用(在这是唯一触发错误的驱动程序的情况下)。至于 Windows 中究竟出了什么问题,这里有龙。

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

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

于 2020-04-19T15:28:25.423 回答
0

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

于 2018-08-05T15:36:05.797 回答
0

多年来,这一直困扰着我作为开发人员和我的朋友作为用户。所有使用 DInput、SDLSDL_INIT_JOYSTICK或任何依赖于此的游戏都需要很长时间才能初始化。

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

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

于 2020-07-27T14:28:27.860 回答
0

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

于 2021-01-27T11:36:30.233 回答