推拉式 FRP 在实现游戏时是否有帮助



我一直在游戏实现中比较仅拉动 FRP(即网络线(和推挽式 FRP(即反应式 bannana(。一个比另一个有优势吗?我注意到的事情是:

  • 推送事件使从 GLFW 或 GLUT 获得鼠标单击/按键事件变得容易
  • NETWIRE使用的箭头FRP漂浮的IO要少得多,这总是更好的。
  • 看起来对鼠标移动之类的事情进行仅拉动响应可能会导致时间泄漏。

我还错过了什么?

编辑,以减少基于意见:主要目标是拥有尽可能富有表现力/简洁的东西,而不会泄漏时间。

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

更新 2:我解决这个问题的方法是让我的游戏模拟线路返回一个Float -> IO (),该采用 alpha 值并执行所有 GL 调用,所有内容都由该 alpha 内插。理想情况下,我应该能够通过MVar将此"draw函数"传递到另一个线程中并在该线程中运行它。伙计,哈斯克尔真棒。

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

如果某个哈斯克尔巫师证明我在这一点上是错的,那就太棒了,但我真的看不出解决方法。如果解释不是很好,我也很抱歉,但如果不亲自尝试,就不是那么容易理解。

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

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

最新更新