27

在游戏的实现中,我一直在比较仅拉式 FRP(即 netwire)和推拉式 FRP(即反应式班纳纳)。一个比另一个有优势吗?我注意到的事情是:

  • 推送事件可以轻松地从 GLFW 或 GLUT 获得鼠标点击/按键事件
  • netwire 使用的带箭头的 FRP 的IO浮动要少得多,这总是更好。
  • 看起来对鼠标移动之类的事情只有拉动响应可能会导致时间泄漏。

我还错过了什么?

编辑,以减少基于意见的内容:主要目标是尽可能表达/简洁,没有时间泄漏。

更新:我发现 Netwire 的一个大问题是似乎没有一种方便的方法来拥有多个帧速率,如“修复你的时间步长”一文中所述。

更新 2:我解决这个问题的方法是让我的游戏模拟线返回 a Float -> IO (),它采用 alpha 值,并使用该 alpha 插值的所有内容执行所有 GL 调用。理想情况下,我应该能够通过 an 将此“绘图函数”传递到另一个线程MVar并在该线程中运行它。伙计,Haskell 很棒。

更新 3:在提出这个问题后的六个月里,我基于 Netwire 和“实体组件编程”的概念开发了一个简单的渲染引擎。在这个过程中,我实际上并没有发现使用 FRP 非常有帮助。在某些情况下,s的表现力Wire实际上已成为一种障碍。问题集中在对象的“身份”上。当定义一个值时Wire类型,它没有身份,即它可以在整个网络中多次重复使用,并且每次代表不同的物理事物。当您想要执行诸如碰撞检测之类的操作并且无法遍历场景图时,这是一个巨大的痛苦,因为如果不融合成一条不透明的线,它就无法存在。这个问题不会出现在“玩具”示例中,因为很容易准确地指定哪些对象的哪些属性与哪些其他对象以何种方式交互。我相信这是任何一种 FRP 的问题。

如果某个 Haskell 向导能证明我在这方面是错误的,那就太棒了,但我真的没有办法绕过它。如果解释不是很好,我也很抱歉,但如果不亲自尝试,它并不是那么容易理解。

4

1 回答 1

2

从我在这里那里看到的内容来看,Netwirereactive-banana有不同的目的和目标。Netwire 专注于对帧信号进行建模,例如游戏服务器,因为游戏服务器通常会以周期性帧的形式将其状态发送给客户端。Reactive-banana 将是创建 GUI 的更好选择,因为 GUI 是纯粹的事件驱动模型并且不能容忍时间泄漏。

在我看来,您可以同时使用两者,具体取决于您要实现的方面。

于 2014-02-19T07:18:46.717 回答