c++ - SDL2 似乎每 50 毫秒才轮询一次输入

标签 c++ c sdl sdl-2

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

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

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

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

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

最佳答案

这与 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相反。

关于c++ - SDL2 似乎每 50 毫秒才轮询一次输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37252298/

相关文章:

c - 数组类型具有不完整的元素类型邻接

c - 这个 GCC 内联汇编中的参数列表有什么问题?

c++ - 如何使用 SDL 修改像素?

sdl - 函数调用中参数前的 @ 在 Pascal 中意味着什么

C++:方法中的字符串成员别名

c++ - 如果两个分数的分母都是 2 的幂,我可以比较两个分数吗

java - 获得快速的 k 成对独立散列函数的选项是什么

c - 如何使用 C 将字符串中的每个字符存储为数字

c - SDL_GetKeyName 的倒数

c++ - GetPath() 能解决这个问题吗?