首页 > 解决方案 > `Akka-Streams` 中的 `extrapolate` 的用例是什么?

问题描述

我刚试过conflateextrapolateakka-streams.

对我conflate来说完全有道理,我没有得到extrapolate.

为什么我们要为下游增加更多的工作——当上游不需要的时候?

来自 Scala 文档:

允许较快的下游独立于较慢的上游进行。

标签: scalaakkaakka-stream

解决方案


举一个例子:

游戏开发

在视频游戏中,通常至少有两个“循环”:一个逻辑/游戏循环和一个渲染循环。通常,游戏循环的速率(“滴答速率”)比渲染循环的速率(“帧速率”)慢。例如,一个逻辑滴答可能每秒发生 10 次,但帧速率通常应至少为每秒 60 帧。为了在滴答之间渲染一些东西,游戏开发人员使用外推法或插值法。正如您可能已经猜到的那样,外推函数非常适合外推。这是一个滴答率为每秒 10 个滴答且没有帧速率限制的示例:

Source.tick(0.millis, 100.millis, 0)
    .scan(intialGameState) { (g, _) => tick(g) }
    .extrapolate(extrapolateFn)
    .runForeach(render)

现在extrapolateFn只需要返回一个迭代器,它可以按需提供推断的游戏状态:

def extrapolateFn(g: GameState) = Iterator.continually {
  // Compute how long it has been since `g` was created
  // Advance the state by that amount of time
  // Return the new state
}

推荐阅读