想象一下我有这样的
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;
// ...