c++ - 为什么事件轮询循环中的函数触发频率低于其外部的函数

标签 c++ c opengl sdl

我有一个自行旋转的立方体和一个按下按键时旋转的立方体。问题在于,自行旋转的旋转总是比仅在按下按键时旋转的旋转更快(快得多)。

while(!quit())
{
  handleInput();
  update();
  render();
}

当我将旋转放在这里时:

update()
{
  cube.rotation += 0.09f;
}

立方体旋转得很快。
但是当我把它放在这里时:

handleinput()
{
   while(pollevent(&event))
   {
      if(event.type == keydown)
      {
        if(event.key.symbol == KEY_r )
        {
           cube.rotation += 0.09f;
        }
      }
   }

速度要慢得多。尽管我认为当按住按键时,每个循环都应该调用一次。
而且我不知道这个问题必须标记什么。

最佳答案

您的 keydown 事件触发频率低于您的游戏逻辑更新频率。

常见的解决方案是跟踪键盘的状态。

SDL方式

我建议将键盘状态存储为 bool 数组,其大小是您要检查的键的数量,例如 bool [SDL_KEYLAST]。 因此,每当事件被触发时,您都必须修改它。最后,在每个循环中,检查保存的键盘状态。 示例代码:

handleInput()
{
    while(pollEvent(&ev))
    {
        if(event.type = keydown)
            ks[event.key.symbol] = true;
        else if(event.type = keyup)
            ks[event.key.symbol] = false;
    }
}

update()
{
    if(ks[KEY_R]) cube.rotation += 0.05f;
}

SDL2方式

const Uint8* ks = SDL_GetKeyboardState(NULL)

此函数返回键盘状态数组,它不是 bool[] 而是包含 0/1 值的 Uint8[](因此您仍然可以检查 false/真值)。

而且,如果您想使用该数组,则必须检查 SDL_Scancode 索引值,如下所示:https://wiki.libsdl.org/SDL_Scancode

handleinput()
{
    //pump events so that SDL can update the keyboard state array...
}

update()
{
    const Uint8* ks = SDL_GetKeyboardState(NULL);
    if(ks[SDL_SCANCODE_R]) cube.rotation += 0.05f;
}

引用:https://wiki.libsdl.org/SDL_GetKeyboardState

关于c++ - 为什么事件轮询循环中的函数触发频率低于其外部的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28070460/

相关文章:

c++ - 为什么实例化后什么也没有发生? (C++ 内存分配器实现)

c - 如何使用C语言函数打印文件内容?

ios - iOS 如何处理低级 C/Objective-C 代码的内存损坏?

c++ - 绘制一个对象,比较模板缓冲区的两个不同值

python - OpenGL 基础 : calling glDrawElements once per object

c++ - 使用 Ortho2D 移动当前图形在 GLUT 中不起作用

c++ - 对在 Protocol Buffers 中使用 Message::ParseFromIstream 感到困惑

c++ - 释放 lpsolve 内存

c++ - 字符串指针的 malloc : how it can be disastrous?

c - 增加枚举 char[ ] 的指针