推拉式FRP在实现游戏时有帮助吗?
Posted
技术标签:
【中文标题】推拉式FRP在实现游戏时有帮助吗?【英文标题】:Does push-pull FRP help when implementing games? 【发布时间】:2014-01-03 08:05:47 【问题描述】:在游戏的实现中,我一直在比较仅拉式 FRP(即 netwire)和推拉式 FRP(即反应式班纳纳)。一个比另一个有优势吗?我注意到的事情是:
推送事件让 GLFW 或 GLUT 的鼠标点击/按键事件变得容易 netwire 使用的带箭头的 FRP 很少有IO
浮动,这总是更好。
看起来对鼠标移动等事件进行仅拉动响应可能会导致时间泄漏。
我还错过了什么?
编辑,以减少基于意见的内容:主要目标是尽可能表达/简洁,没有时间泄漏。
更新:我发现 Netwire 的一个大问题是似乎没有一种方便的方法来拥有多个帧速率,如文章“修复您的时间步长”中所述。
更新 2: 我解决这个问题的方法是让我的游戏模拟线路返回一个 Float -> IO ()
,它采用 alpha 值并使用该 alpha 插值的所有内容执行所有 GL 调用.理想情况下,我应该能够通过MVar
将此“绘图函数”传递到另一个线程并在该线程中运行它。伙计,Haskell 很棒。
更新 3: 在提出这个问题后的六个月里,我基于 Netwire 和“实体组件编程”的概念开发了一个 simple rendering engine。在这个过程中,我实际上并没有发现使用 FRP 非常有帮助。 Wire
s 的表达能力实际上在某些情况下成为了障碍。问题集中在对象的“身份”上。当定义一个Wire
类型的值时,它是没有标识的,即它可能在整个网络中被重复使用多次,并且每次代表不同的物理事物。当您想要执行诸如碰撞检测之类的操作并且无法遍历场景图时,这是一个巨大的痛苦,因为如果不融合成一条不透明的线,它就无法存在。这个问题不会出现在“玩具”示例中,因为很容易specify exactly 哪些对象的哪些属性与哪些其他对象以哪些方式交互。我相信这是任何一种 FRP 的问题。
如果某个 Haskell 向导能证明我在这方面是错误的,那就太棒了,但我真的找不到解决办法。另外,如果解释不是很好,我很抱歉,但如果不亲自尝试,这并不是那么容易理解。
【问题讨论】:
【参考方案1】:据我所知,here 和 there、Netwire 和 reactive-banana 有不同的目的和目标。 Netwire 专注于对帧信号进行建模,例如游戏服务器,因为游戏服务器通常会以周期性帧的形式将其状态发送给客户端。 Reactive-banana 将是创建 GUI 的更好选择,因为 GUI 是纯粹的事件驱动模型,不能容忍时间泄漏。
在我看来,您可以同时使用这两种方法,具体取决于您要实现的方面。
【讨论】:
有趣。它们彼此兼容吗?即,您可以将信息从一个转移到另一个吗? 在游戏引擎中使用过 netwire 之后,我可以说它非常适合该目的,原因您所述。以上是关于推拉式FRP在实现游戏时有帮助吗?的主要内容,如果未能解决你的问题,请参考以下文章