【问题标题】:SFML delaying time with clock doesn't workSFML 用时钟延迟时间不起作用
【发布时间】:2018-04-08 19:22:33
【问题描述】:

我正在做一个SFML框架,所以我做了一个延迟时间的函数。我没有使用sf::sleep,因为它会停止整个应用程序。所以我用了一个时钟,但它不起作用。这是代码:

void FM::time::waitForSeconds(float seconds){

    bool finished = false;
    float elapsedTime = 0;
    sf::Clock clock;
    while (!finished) {

        elapsedTime += clock.getElapsedTime().asSeconds();
        if (elapsedTime >= seconds) {

            finished = true;
            clock.restart();
        }
    }
}

【问题讨论】:

  • 这和睡眠没有什么不同,只是会消耗大量的cpu,并且等待的时间会稍微准确一些。即使您修复了代码,这也会阻止应用程序。

标签: c++ time sfml


【解决方案1】:

根据documentation,函数getElapsedTime()返回自上次调用sf::Clock::restart或自创建对象以来的时间。这意味着变量elapsedTime 的值增加得比你想象的要快。

如果您将整个 while 循环更改为以下内容:

for(;clock.getElapsedTime().asSeconds() < seconds;); //Note the semi colon.

它应该可以工作。

我假设当你说它不起作用时,你的意思是它完成得太“早”了。

【讨论】:

  • 这里有两个问题:首先,这会创建一个繁忙的循环,即 CPU 将尽可能快/频繁地运行这个循环,从而导致不必要的开销,并且基本上也会暂停线程。其次,您不应该以这种方式使用while(),因为这通常不是故意的,并且可能会被检测为潜在的错误(另外我认为编译器甚至可以对其进行优化;尽管不要引用我的话) .如果你真的坚持要实现这样的循环,请改用for(;condition;);
  • 我认为 OP 出于某种原因想要一个繁忙的循环。关于使用 for 循环的好点。我已经相应地编辑了我的答案。
猜你喜欢
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2013-10-24
  • 2011-05-31
相关资源
最近更新 更多