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

但是,我没有在文档中找到任何暗示此类数据存在于sf::Event类中的数据。

问题1:此数据是否存在于sf::Event中。我有一个模糊的回忆,可能是在sfml的早期版本中,还是在另一个window工具箱中?

问题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是? (?)两者都是“操作系统”,因为它们可以管理多个任务,因此,“最精确的理论上可行的方法”可以从OS本身扩展来记录按键的时间戳吗?一个人可以访问该数据(如果存在)吗?

我使用Linux,但这实际上是针对Windows项目的-我对此一无所知。

最佳答案

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

这是密钥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/

10-13 03:21