SDL2似乎每隔50ms轮询一次输入

时间:2016-05-16 10:58:17

标签: c++ c sdl sdl-2

我注意到SDL2似乎只在大约50ms处轮询输入。

例如,如果我轮询这样的事件是我的主循环

SDL_Event event;
while(SDL_PollEvent(&event)){
    if(event.type == SDL_KEYDOWN || event.type == SDL_KEYUP){
         inputs.push_back(...);
    }
}

对于某些帧,输入向量实际上是空的。只有当我在主循环中使用SDL_Delay(50)时,我才能避免获得空的输入向量。

我可以强制SDL2更快地更新输入50ms吗?

1 个答案:

答案 0 :(得分:5)

这与SDL毫无关系。 SDL是PeekMessage等函数的包装器,SDL不能返回比这些底层平台特定函数更高分辨率的事件。实际硬件轮询速率将由操作系统管理,通常低于10毫秒,有时低至1毫秒。

该名称可能有些误导,因为SDL_PollEvent实际上并未轮询硬件。相反,硬件轮询在后台连续发生,作为操作系统功能的正常部分。 SDL_PumpEvents将事件从OS事件队列移动到SDL事件队列。 SDL_PollEvent将事件从SDL事件队列移动到您自己的应用程序。因此,请将SDL_PollEvent视为轮询操作系统队列而不是轮询实际硬件。

看起来这里的问题是一个误解。 SDL_KEYDOWN事件并不意味着密钥 已关闭,这意味着密钥变为已关闭或正在“重复”。重复率可配置操作系统的控制面板。因此,如果我按一个键,按住它,然后释放它,我将得到一系列这样的事件:

SDL_KEYDOWN  pressed the key
SDL_KEYDOWN  repeat #1, after the repeat delay
SDL_KEYDOWN  repeat #2, quickly afterwards
SDL_KEYDOWN  repeat #3, quickly
...          ...
SDL_KEYUP    released the key

你会想要这样的东西:

switch (event.type) {
case SDL_KEYDOWN:
    key_pressed = true;
    break;
case SDL_KEYUP:
    key_pressed = false;
    break;
}

或者您可以改为使用SDL_GetKeyboardState