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 контроллеры на самом деле подключены.

Другие вопросы по тегам