2012-06-10 63 views
3

有時(約50%的運行),EnumDevices需要5-10秒才能返回。通常它幾乎是瞬間的。我找不到任何其他這類行爲的報道。DirectInput8枚舉設備有時會痛苦地慢

當事情是這樣慢,這是確定通過觀察標準輸出:)這剖析:

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,這看起來很正常。

但1次在10,這需要幾乎一模一樣5秒返回。在準備的調用堆棧上是ntkrnlmp.exe!KiTimerExpiration而不是HIDUSB.SYS函數。我猜這一切都表明HIDUSB.SYS驅動程序以5秒的超時異步查詢設備,有時會失敗並且達到此超時時間。

我不知道這是否失敗與特別是任何一個設備(我確實有一些USB的HID)或相關的,如果它是隨機的 - 這是很難測試,因爲它並不總是發生。再次,任何人都可以給我的信息將不勝感激,儘管我不抱希望微軟在任何時候儘快解決DirectInput的問題!

也許我就不得不開始初始化先輸入,異步,並接受,有時還會有之前用戶輸入可能發生延遲5秒。

回答

3

我跑這個也主要是作爲最終用戶,但它一直惱人的地獄了我好多年了。直到我在開源項目中遇到它並能夠調試它時,我才意識到這是這個問題。

原來這是我的USB耳機DAC(目標DAC從Massdrop),它會安裝驅動程序: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 Input Device」條目似乎不會造成負面影響,並完全解決了我的問題。

將音頻輸出從DAC更改爲其他任何東西也奇怪地解決了這個問題。

這太糟糕了,它使遊戲手柄配置對話框joy.cpl無法使用,掛起並最終崩潰。

我想這只是一個評論,但我沒有足夠的代表它,這幾乎是互聯網上描述這個問題,但希望這有助於別人有一天的唯一地方!

+0

非常有趣!謝謝!我從來沒有深入到底,也從來沒有在其他機器上發生過,所以我認爲它是壞的設備或其他東西,而且你的報告也是一樣的!很高興知道我不是它唯一影響的人! –

0

使用我的Corsair K55鍵盤時遇到同樣的問題。改變USB端口的鍵盤可以解決這個問題一段時間,但稍後它會回來。所以它似乎是一個有問題的驅動程序問題。