如何在不延迟循环的情况下延迟while循环中调用的函数



想象一下我有这样的

void color(int a)
{
if (a > 10)
{
return;
}
square[a].red();
sleep(1second);
color(a+1);
}
while (programIsRunning())
{
color(1);
updateProgram();
}

但实际上需要递归函数。我怎么能调用这个递归函数来逐个给正方形上色呢。因为它本身太快了,而且如果程序每帧都在更新。当我希望它们一个接一个地着色时(有延迟(,它们会立即着色。

sleep()将导致当前线程停止。这使得它成为人类从主线程感知到的延迟的糟糕候选者。

你"可以";有一个只处理该进程的线程,但线程成本很高,并且创建/管理一个线程只为序列中的正方形上色是完全过分的。

相反,你可以做一些类似的事情:每次程序更新时,检查是否是给下一个正方形上色的合适时机。

const std::chrono::duration<double> color_delay{0.1};
auto last_color_time = std::chrono::steady_clock::now();
bool coloring_squares = true;
while (programIsRunning()) {
if (coloring_squares) {
auto now = std::chrono::steady_clock::now();
// This will "catch up" as needed.
while (now - last_color_time >= color_delay) {
last_color_time += color_delay;
coloring_squares = color_next_square();
}
}
updateProgram();
}

color_next_square()如何工作取决于您。你可能";预烘烤";要使用递归函数着色的正方形列表,并对其进行迭代。

而且,很明显,这个例子只是使用了您发布的代码。您将希望将所有这些组织为updateProgram()的一部分,可能是在某种class SquareAnim {};状态包装器中。

N。B.如果您的程序抖动很小,即更新之间的时间一致,并且延迟很低,则使用以下方法可以获得稍微平滑的动画:

if (now - last_color_time >= color_delay) {
last_color_time = now;
// ...

最新更新