2个不稳定版本

0.2.0 2019年7月26日
0.1.0 2019年5月7日

#36 in #scheduling

BSD-3-Clause

16KB
147

awoo

动画和调度代码。

这听起来可能令你惊讶,但许多演示场景作品都是用这种类型的 if / else if 块编写的。虽然我同意这很糟糕和丑陋。

let mut time = 0.; // time that passes
let a = 0.;
let b = 1.;
let c = 2.;

// main loop of our application
loop {
  if time < a {
    // do something until time passes a point in time a
  } else if time < b {
    // do something until time passes a point in time b
  } else if time < c {
    // do something until time passes a point in time c
  } // etc. etc.

  // time advances here
  time += 0.1;

  if time >= c {
    break
  }
}

出于几个原因

  • 它根本不具组合性。如果你想在 α 和 β 之间做某事,你将不得不打断整个块并更改每个时间。
  • 随着时间的推移,动态分支将越来越差,因为你将做更多的测试。
  • 代码看起来真的很糟糕!

我们可以做得更好,而不是编写这种代码

use awoo::window::Window;

let pre_alpha = Window::new(0., 1.); // do something until time passes 1.
let pre_beta = Window::new(1., 2.); // do something until time passes 2.
let pre_gamma = Window::new(2., 3.); // do something until time passes 3.

默认情况下,Window<T> 只是一个时间窗口 T。我们可以将操作映射到与上面完全相同的事情

let pre_alpha = Window::new(0., 1.).map(|time| println!("time is {}", time));

MappedWindow<_> 的类型由你在 map 调用中的闭包返回值决定。一旦所有窗口创建完成,你可以安排它们

use awoo::scheduler::RandomAccessScheduler;
use awoo::time::simple::SimpleF32TimeGenerator;

let mut scheduler = RandomAccessScheduler::new(
  SimpleF32TimeGenerator::new(0., 0.1), // a generator that generates linear time starting at 0 and incrementing by 0.1
  vec![pre_alpha, pre_beta, pre_gamma] // our mapped windows
).unwrap();

scheduler.schedule();

有趣的是,我们可以从文件中获取窗口,例如,并动态映射它们。

依赖项

~185KB