2012-06-10 3 views
3

Иногда (примерно 50% пробегов) EnumDevices занимает 5-10 секунд, чтобы вернуться. Обычно это почти мгновенно. Я не мог найти никаких других сообщений о таком поведении.DirectInput8 EnumDevices иногда болезненно медленный

Когда вещи это медленно, это нормально профиль, наблюдая стандартный вывод :) Это:

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, чтобы определить это.

Любые идеи о том, почему это может быть так медленно, будут очень благодарны!

EDIT:

мне удалось поймать вишу в файле трассировки ETL и анализируют его в ОС Windows Performance Analyzer. Похоже, что EnumDevices созванивает до DInput8.dll!fGetProductStringFromDevice, который вызывает HIDUSB.SYS!HumCallUSB, который вызывает KeWaitForSingleObject и ждет. 9 раз из 10 (буквально - на трассе есть 10 образцов), это очень быстро возвращается (324us каждый), при этом готовый столбец содержит usbport.sys!USBPORT_Core_iCompleteDoneTransfer, а затем HIDUSB.SYS!HumCallUsbComplete, что выглядит вполне нормально.

Но 1 раз в 10 это занимает почти ровно 5 секунд, чтобы вернуться. На готовом стоп-камере ntkrnlmp.exe!KiTimerExpiration вместо функции HIDUSB.SYS. Я предполагаю, что все это указывает на то, что драйвер HIDUSB.SYS запрашивает устройства асинхронно с таймаутом 5 секунд, а иногда он терпит неудачу и ударяет этот таймаут.

Я не знаю, связан ли этот сбой с каким-либо одним устройством (у меня есть несколько USB-HID), или если оно случайное - его трудно проверить, потому что это не всегда происходит. Опять же, любая информация, которую кто-либо может мне дать, будет оценена, хотя я не буду надеяться на то, что Microsoft исправляет это в ближайшее время, учитывая нечетную ситуацию, в которую входит DirectInput!

Возможно, мне просто нужно начать инициализацию ввода раньше, асинхронно, и принять, что иногда будет задержка на 5 секунд, прежде чем пользовательский ввод может произойти.

ответ

3

Я тоже сталкивался с этим, в основном, как конечный пользователь, но это меня раздражало многие годы. Я не понимал, что это проблема, пока я не столкнулся с ней в проекте с открытым исходным кодом и не смог его отладить.

Оказывается, это был мой USB наушники DAC (Объективный ЦАП Massdrop), он устанавливает драйвер: wdma_usb.inf_amd64_134cb113911feba4\wdma_usb.inf для устройств Instance 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, но ...Когда они включены, и этот ЦАП установлен как устройство вывода звука, как IDirectInput8_CreateDevice, так и EnumDevices являются очень медленными. Отключение записи «Устройство USB-входа», по-видимому, не вызывает никаких негативных последствий и полностью решает мою проблему.

Изменение аудиовыхода ЦАП на все остальное также странно решило проблему.

Это было так плохо, что он сделал диалог конфигурации Gamepad joy.cpl непригодным для использования, зависанием и в конечном итоге сбой.

Я хотел, чтобы это было просто комментарием, но у меня нет достаточного количества отзывов, и это почти единственное место в Интернете, которое описывает эту проблему, хотя, надеюсь, это поможет кому-то еще в один прекрасный день!

+0

Очень интересно! Благодаря! Я так и не дошел до сути, и никогда не было этого на любой другой машине, поэтому я предположил, что это устройства с плохой эксплуатацией или что-то в этом роде, и ваш отчет предлагает то же самое! Приятно знать, что я не единственный, на кого это влияет! –

0

У вас такая же проблема, когда у меня есть клавиатура Corsair K55. Изменение клавиатуры USB-порта исправляет проблему некоторое время, но потом она возвращается позже. Так что это проблема с драйверами.

Смежные вопросы