【问题标题】:How to slowdown visualization algorithm如何减慢可视化算法
【发布时间】:2021-05-31 00:44:46
【问题描述】:

我正在使用 C++ 在 SFML 中创建一个排序可视化应用程序。 我遇到了排序循环延迟的问题。 我制作了两个“按钮”,一个用于排序,另一个用于对向量中的数据进行洗牌,一切正常,我只是无法延迟工作,我试图将 sf::Time 与 sf::Clock 和sf::sleep,两者都失败了。

更新循环(此处添加了计时器,因此用户不能每秒点击 100 次,它真的不会是一个很酷的应用,它只是为了简单的可视化)

void App::update() {


this->pollEvents();
this->updateMousePos();
this->shuffleButton->update(this->mousePosView);
if (shuffleButton->isPressed()) {
    this->time = this->clock.getElapsedTime();
    if (time.asSeconds() >= 0.5) {
        this->shuffle();
        clock.restart();
    }
}
this->bubbleSortButton->update(this->mousePosView);
if (bubbleSortButton->isPressed()) {
    this->time = this->clock.getElapsedTime();
    if (time.asSeconds() >= 0.5) {
        this->bubbleSort();
        clock.restart();
    }
  }
}

排序算法(条形排序正确,可视化效果非常好,显然速度太快了)

void App::bubbleSort(){
int size = this->bars.size();
do {
    for (size_t i = 0; i < size - 1; i++) {
        if (this->bars[i].getGlobalBounds().height > this->bars[i + 1].getGlobalBounds().height) {
                int x = this->bars[i].getPosition().x;
                int xS = this->bars[i + 1].getPosition().x;
                this->bars[i].setPosition(xS, 700);
                this->bars[i + 1].setPosition(x, 700);
                std::swap(this->bars[i], this->bars[i + 1]);
        }
    }
    --size;
  } while (size > 1);
}

我以前从未要求过 SFML 中的解决方案,因此如果提供的代码不足,我深表歉意,我期待添加您需要的任何内容。

【问题讨论】:

  • timeAsSeconds() 是否返回浮点数?可能不是。你可能想要的是getTimeAsMS() &gt; 500
  • C++20 协程可能会有所帮助......在您可能不得不重新设计您的函数以“逐步”完成之前。然后你可能会在不同的步骤之间暂停/睡眠。
  • Devolus 它实际上是@Jarod42 我一定会查一下,尽管它与每个 MinGW 构建完全兼容吗?可能是一个愚蠢的问题,但我是真的;;你是一个新手,我在配置 SMFL 和 c++ 编译器时遇到了一些麻烦,因为它的版本不兼容

标签: c++ time timer sfml slowdown


【解决方案1】:

按下按钮后您忘记将时间重置为零。

if (shuffleButton->isPressed()) {
    this->time = this->clock.getElapsedTime();

    if (time.asSeconds() >= 0.5) {
        this->shuffle();
        clock.restart();
        time = 0; 
    }
}

正如另一位用户指出的那样,理想情况下,您应该逐步解决,并让算法在每个循环中暂停,如下所示:

sf::Time time = sf::milliseconds(sleepForInMiliseconds);
sf::sleep(time);

其中sleepForInMiliseconds 是您首选的步进延迟的整数。有趣的是,我正在从事完全相同的项目,所以我也可以帮助解决任何其他问题。

【讨论】:

  • 谢谢!它确实有帮助,虽然我并不是真的喜欢 C++(主要是因为大学而使用它)所以我必须感谢你提供帮助:) 我在学习 React 的过程中用了 2 天时间完成了相同的项目,我认为 SFML 几乎不可能:D
  • @majkels 是的,对于一个名为“simple”的库,它有时真的很难使用。
猜你喜欢
  • 2017-06-13
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多