XInputGetState зависает
Я пытаюсь использовать XInput API для своего игрового движка (я использую DirectX11 и C++). Я просто хочу проверить, найден ли контроллер, поэтому я #included и вызываю XInputGetState, но я получаю странное поведение:
XINPUT_STATE state;
ZeroMemory(&state, sizeof(XINPUT_STATE));
DWORD result;
for (DWORD i = 0; i < XUSER_MAX_COUNT; i++)
{
result = XInputGetState(i, &state);
if (result == ERROR_SUCCESS)
ErrorBox(L"found controller on port ");
}
если я подключаю контроллер, программа зависает и зависает, а если я отключаю контроллер, игра запускается. Если я перейду к коду с помощью отладчика, результатом будет то, что контроллер найден и появится окно сообщения. Зачем?
РЕДАКТИРОВАТЬ, кажется, проблема в вызове ErrorBox: эта функция просто отображает окно сообщений с помощью Win32 API.
1 ответ
Производительность снижается, когда вы проверяете контроллер, который не был подключен в прошлый раз, когда вы вызывали его, потому что он должен перечислять устройство, открывать соединения с драйверами и т. Д. Поэтому рекомендуется выполнять циклический обмен вызовами для проверки новых контроллеров. Если вы получаете ERROR_DEVICE_NOT_CONNECTED
назад, вы не должны звонить XInputGetState
снова на этот слот на некоторое время. Для примера, см. Класс GamePad в инструменте Directx Ki и ThrottleRetry
функция.
Другими словами, цикл, который вы написали ранее, не является хорошей идеей для вызова каждого кадра, если нет XUSER_MAX_COUNT
контроллеры на самом деле подключены.