c++ - 使用 SFML 精确事件计时

标签 c++ linux windows sfml timing

问题

如果用户想知道在 SFML 中使用事件轮询循环按下按键的“精确”时间,一种可能的方法是查询与每个 sf::Event 捆绑在一起的时间戳数据。

但是,我在文档中没有发现任何内容表明 sf::Event 类中存在此类数据。

问题 1:此数据是否存在于 sf::Event 中。我模糊地记得它可能是在 sfml 的早期版本或另一个窗口工具包中实现的?

问题 2:如果不能,那么是否可以准确测量按键按下的时间?

问题 3:还有其他窗口工具包可以实现此操作吗?

代码

目前我正在执行以下操作:

double time_pressed = 0.0;

sf::Clock clock;
clock.restart();

while(window.isOpen())
{

    // Timing control
    const double delay_time = 1.0 / 100.0;
    double current_delay_time = clock.restart().asSeconds();
    if(current_delay_time < delay_time)
    {
        sf::sleep(sf::seconds(delay_time - current_delay_time));
    }

    sf::Event event;
    while(window.pollEvent(event))
    {

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
        {
            time_pressed += current_delay_time; // !
        }
    }

    // Other code

    window.display();

}

是否有更好或改进的方法来做到这一点?

我知道这可能取决于操作系统,考虑到 Linux 不是 RTOS 而我相信 Windows 是? (?)从管理多个任务的意义上来说,两者都是“操作系统”,因此大概“理论上最准确的方法”是从操作系统本身记录按键时间戳延伸而来的?如果该数据存在,人们可以访问它吗?

我使用 Linux,但这实际上是一个 Windows 项目 - 我对此知之甚少。

最佳答案

此解决方案需要为您想要测量的每个键实例化 sf::Clock,因为在您已经测量另一个键时可以按下一个键。因此,这里假设您只想测量特定键的时间。否则,您可以实现一个系统,每次按下新键且已经按下另一个键时,都会将 sf::Clock 推送到容器中,并在使用后从容器中删除该时钟。您需要以某种方式保存容器中时钟的位置。

这是 key K 的任意解决方案:

sf::Clock kKeyClock;
bool kKeyPressed = false;
sf::Time kKeyTime;

while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if ( event.type == sf::Event::KeyReleased )
            if ( event.key.code == sf::Keyboard::K )
            {
                kKeyTime = kKeyClock.getElapsedTime();
                kKeyPressed = false;
            }
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::K))
    {
        if ( !kKeyPressed )
        {
            kKeyClock.restart();
            kKeyPressed = true;
        }
    }
}

这个解决方案看起来足够准确吗?或者我可能误解了这个问题?

我认为 sf::Event 不提供时间信息,但如果您查看文档,您可以确定。我不知道其他窗口库。

关于c++ - 使用 SFML 精确事件计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32140010/

相关文章:

linux - 如何对数字前面附加字符的字段进行数字 UNIX 排序

c++ - 我的 char 数组显示的最后几个字符很短。 C++

python - 如何将文件夹中的所有文件类型更改为特定类型?

c++ - qi % 运算符使用 (1) 分隔符属性和 (2) 接受尾随分隔符

linux - Golang os.Create 权限被拒绝

windows - PowerShell [wmiclass] Win32_Process.Create() 然后等待批处理文件完成

windows - C99 代码在 Linux 上编译,在 Windows 上语法错误

windows - Haskell 和 Docker 合理部署的镜像大小?

c++ - 如何从 ADO/C++ 调用 MSSQL 系统函数?

c++ - 在makefile中规避重复库头和typedef的方法