Я пытаюсь использовать 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.
Производительность снижается, когда вы проверяете контроллер, который не был подключен в прошлый раз, когда вы вызывали его, потому что он должен перечислять устройство, открывать соединения с драйверами и т. Д. Поэтому рекомендуется выполнять циклический обмен вызовами для проверки новых контроллеров. Если вы получаете ERROR_DEVICE_NOT_CONNECTED
назад, вы не должны звонить XInputGetState
снова на этот слот на некоторое время. Пример этого см. GamePad класс в Directx Tool Ki и ThrottleRetry
функция.
Другими словами, цикл, который вы написали ранее, не является хорошей идеей для вызова каждого кадра, если нет XUSER_MAX_COUNT
контроллеры на самом деле подключены.
Других решений пока нет …