【问题标题】:SDL2 only seems to poll input every 50msSDL2 似乎只每 50 毫秒轮询一次输入
【发布时间】:2016-05-16 19:19:22
【问题描述】:

我注意到 SDL2 似乎只在大约 50 毫秒时轮询输入。

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

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

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

我可以强制 SDL2 以超过 50 毫秒的速度更新输入吗?

【问题讨论】:

  • 有实际投票吗?在大多数操作系统上似乎有点奇怪......
  • @MartinJames 我不确定你想说什么。您是说50ms 是我的操作系统轮询输入的频率吗? 50ms 似乎相当大。在 60fps 时,我只会每 3 帧获得新的输入。

标签: c++ c sdl sdl-2


【解决方案1】:

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

这个名字可能有点误导,因为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

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多