我注意到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吗?
答案 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。