我注意到 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/