手柄热插拔不起作用
Gamepad hot plugging does not work
在 OS X 中,我的游戏手柄在应用程序启动时在 SDL_PollEvent()
中被正确识别。但是,当我尝试热插拔新游戏手柄或移除旧游戏手柄时,SDL_PollEvent()
不会触发 SDL_CONTROLLERDEVICEADDED
或 SDL_CONTROLLERDEVICEREMOVED
。当我热插拔游戏控制器时,相同的代码在 Windows 中正常工作。
一个更有趣的注意事项是,如果我调整应用程序 window 的大小,热插拔就会起作用。在调整大小事件之后,所有的热插拔事件都会被触发。似乎游戏手柄事件被放入某种等待队列中,当调整大小事件发生时该队列被清除。我的 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;
有没有其他人遇到过这种情况?
经过一番努力,我找到了解决方案:从主线程调用 SDL_PollEvent()
。最初我从 CVDisplayLink 线程调用了游戏手柄处理方法,这导致了所描述的行为。
在我的例子中,解决方案只是将 dispatch_async
调用添加到我的游戏手柄处理函数中。
dispatch_async(dispatch_get_main_queue(),^ { handleGamePad();});
在 OS X 中,我的游戏手柄在应用程序启动时在 SDL_PollEvent()
中被正确识别。但是,当我尝试热插拔新游戏手柄或移除旧游戏手柄时,SDL_PollEvent()
不会触发 SDL_CONTROLLERDEVICEADDED
或 SDL_CONTROLLERDEVICEREMOVED
。当我热插拔游戏控制器时,相同的代码在 Windows 中正常工作。
一个更有趣的注意事项是,如果我调整应用程序 window 的大小,热插拔就会起作用。在调整大小事件之后,所有的热插拔事件都会被触发。似乎游戏手柄事件被放入某种等待队列中,当调整大小事件发生时该队列被清除。我的 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;
有没有其他人遇到过这种情况?
经过一番努力,我找到了解决方案:从主线程调用 SDL_PollEvent()
。最初我从 CVDisplayLink 线程调用了游戏手柄处理方法,这导致了所描述的行为。
在我的例子中,解决方案只是将 dispatch_async
调用添加到我的游戏手柄处理函数中。
dispatch_async(dispatch_get_main_queue(),^ { handleGamePad();});