我注意到SDL2似乎只在大约50ms处轮询输入.
例如,如果我轮询这样的事件是我的主循环
SDL_Event event;
while(SDL_PollEvent(&event)){
if(event.type == SDL_KEYDOWN || event.type == SDL_KEYUP){
inputs.push_back(...);
}
}
Run Code Online (Sandbox Code Playgroud)
对于某些帧,输入向量实际上是空的.只有当我SDL_Delay(50)在我的主循环中使用时,我才能避免得到一个空的输入向量.
我可以强制SDL2更新输入的速度超过50ms吗?
这与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
Run Code Online (Sandbox Code Playgroud)
你会想要这样的东西:
switch (event.type) {
case SDL_KEYDOWN:
key_pressed = true;
break;
case SDL_KEYUP:
key_pressed = false;
break;
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用SDL_GetKeyboardState.
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |