Ben*_*ers 4 c++ directinput wait
有时(大约50%的运行),EnumDevices需要5-10秒才能返回.通常它几乎是即时的.我找不到任何关于这种行为的其他报道.
当事情变得缓慢时,可以通过观看标准输出来进行分析:)这:
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;
}
Run Code Online (Sandbox Code Playgroud)
似乎通过枚举设备随机挂起 - 有时它会在回调被调用之前,有时在一对之后,有时它会在最后一次调用之后.
这显然是一个简化的代码块; 我实际上正在使用OIS输入库(http://sourceforge.net/projects/wgois/),因此对于上下文,请在此处查看完整的源代码:
然而,似乎没有任何特别的果味,但可能是他们初始化的原因可能是原因 - 我不太了解DI8发现它.
任何有关它为何如此缓慢的想法将不胜感激!
编辑:
我已设法抓住etl跟踪文件中的挂起并在Windows性能分析器中对其进行分析.看起来EnumDevices最终调用DInput8.dll!fGetProductStringFromDevice,调用HIDUSB.SYS!HumCallUSB,调用KeWaitForSingleObject和等待.10次中有9次(字面意思是 - 跟踪中有10个样本)这很快就会返回(每次324us),其中包含usbport.sys!USBPORT_Core_iCompleteDoneTransfer紧随其后的readstack HIDUSB.SYS!HumCallUsbComplete,这看起来很正常.
但是10次中的1次,这几乎需要5秒才能返回.在准备好的callstack ntkrnlmp.exe!KiTimerExpiration而不是HIDUSB.SYS函数.我想这一切都表明HIDUSB.SYS驱动程序异步查询设备的超时时间为5秒,有时它会失败并达到此超时.
我不知道这个故障是否与任何一个设备特别相关(我确实有一些USB HID)或者它是随机的 - 它很难测试,因为它并不总是发生.同样,任何人都可以给我的任何信息都会受到赞赏,但是由于DirectInput出现了奇怪的情况,我不希望微软很快解决这个问题!
也许我只需要在早期,异步地开始初始化输入,并接受有时在用户输入发生之前会有5秒的延迟.
我也遇到了这个问题,很大程度上是作为最终用户,但多年来一直让我烦恼不已.直到我在一个开源项目上遇到它并且能够调试它之前我才意识到这是这个问题.
原来它是我的USB耳机DAC(来自Massdrop的Objective 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 Device和HID-compliant consumer control device.
我不知道HID条目的作用是什么,但......当它们被启用并且此DAC被设置为音频输出设备时,IDirectInput8_CreateDevice和EnumDevices都非常慢.禁用"USB输入设备"条目似乎不会产生任何负面影响,并完全解决了我的问题.
将音频输出从DAC更改为其他任何东西也奇怪地解决了这个问题.
这太糟糕了,它使游戏手柄配置对话框joy.cpl无法使用,挂起并最终崩溃.
我希望这只是一个评论,但我没有足够的代表,这是互联网上唯一描述这个问题的地方,尽管希望有一天能帮助别人!