游戏手柄热插拔不起作用

Posted

技术标签:

【中文标题】游戏手柄热插拔不起作用【英文标题】:Gamepad hot plugging does not work 【发布时间】:2015-05-12 15:37:31 【问题描述】:

在 OS X 中,我的游戏手柄在应用程序启动时在 SDL_PollEvent() 中被正确识别。但是,当我尝试热插拔新游戏手柄或移除旧游戏手柄时,SDL_PollEvent() 不会触发SDL_CONTROLLERDEVICEADDEDSDL_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(););

【讨论】:

以上是关于游戏手柄热插拔不起作用的主要内容,如果未能解决你的问题,请参考以下文章

游戏手柄 API“gamepadconnected”不起作用

JBoss,IntelliJ IDEA,部署炸耳,子部署不起作用

使用 usbfs 在 USB 设备上调用 ioctl() 不起作用

jQuery UI 滑块自定义不起作用 [关闭]

为游戏手柄创建自定义设备驱动程序

计算机基础-热插拔raid卡服务器机箱