Горячая замена геймпада не работает
В OS X мои геймпады правильно распознаются в SDL_PollEvent()
при запуске приложения. Тем не менее, когда я пытаюсь горячо подключить новые геймпады или удалить старые геймпады, SDL_PollEvent()
тоже не срабатывает SDL_CONTROLLERDEVICEADDED
или же SDL_CONTROLLERDEVICEREMOVED
, Тот же код работает правильно в Windows, когда я подключаю игровые контроллеры.
Более интересным примечанием является то, что если я изменю размер окна моего приложения, горячее подключение работает. После события изменения размера все события горячего подключения запускаются. Кажется, что события геймпада помещаются в некую очередь ожидания, которая очищается, когда происходит событие изменения размера. мой SDL_PollEvent()
код довольно стандартный, как показано ниже.
case SDL_CONTROLLERDEVICEADDED:
if (SDL_IsGameController(e.cdevice.which))
{
SDL_GameController *pad = SDL_GameControllerOpen(e.cdevice.which);
if (pad)
{
SDL_Joystick *joy = SDL_GameControllerGetJoystick(pad);
int instanceID = SDL_JoystickInstanceID(joy);
if(m_gameControllers.count(instanceID) == 0)
{
m_gameControllers.insert(std::make_pair(instanceID, pad));
}
}
}
break;
case SDL_CONTROLLERDEVICEREMOVED:
{
auto it = m_gameControllers.find(e.cdevice.which);
if (it != m_gameControllers.end())
{
SDL_GameController* pad = m_gameControllers[e.cdevice.which];
SDL_GameControllerClose(pad);
m_gameControllers.erase(it);
}
}
break;
Кто-нибудь еще испытывал это?
1 ответ
После некоторой борьбы я нашел решение: Позвонить SDL_PollEvent()
из основного потока. Изначально я вызвал метод обработки геймпада из потока CVDisplayLink, который привел описанное поведение.
В моем случае решение было просто добавить dispatch_async
вызовите мою функцию обработки геймпада.
dispatch_async(dispatch_get_main_queue(),^ { handleGamePad();});