在游戏实施过程中,我一直在将仅拉式FRP(即网线)与推拉式FRP(即反应性 - 香蕉)进行比较。一个优于另一个有优势吗?我注意到的事情是:
IO
周围浮动的次数要少得多,这总是更好。我还错过了什么?
编辑,使其不那么基于意见:主要目标是尽可能地表达/简洁,没有时间泄漏。
更新:我在Netwire上发现的一个大问题是,如果文章&#34中所述,似乎不是一种方便的方法来拥有多个帧速率。修复你的Timestep。"
更新2:我解决这个问题的方法是让我的游戏模拟线路返回一个Float -> IO ()
,它获取alpha值并完成所有GL调用由该alpha插值。理想情况下,我应该能够通过这个"绘制功能"通过MVar
进入另一个线程并在该线程中运行它。男人,哈斯克尔太棒了。
更新3:在提出这个问题后的六个月里,我开发了一个基于Netwire的simple rendering engine,以及"实体组件编程的概念。&#34 ;在这个过程中,我实际上没有发现使用FRP非常有用。在某些情况下,Wire
的表现力实际上已成为障碍。这个问题围绕着#34;身份"对象在定义Wire
类型的值时,它没有标识,即它可以在整个网络中多次重复使用,并且每次表示不同的物理事物。当你想要做一些像碰撞检测这样的事情并且无法遍历场景图时,这是一个巨大的痛苦,因为它不能在不融合成单根不透明线的情况下存在。这个问题不会发生在"玩具"示例,因为很容易specify exactly哪些对象的哪些属性与哪些其他对象进行交互。我相信这是任何一种FRP的问题。
如果一些Haskell巫师在这方面证明我的错误,那将是非常棒的,但我并没有真正看到它的方法。另外,如果解释不是很好,我很抱歉,但如果不自己动手,它就不那么容易理解。
答案 0 :(得分:2)
根据我的阅读here和there,Netwire和reactive-banana有不同的目的和目标。 Netwire专注于对帧化信号进行建模,例如游戏服务器,因为游戏服务器通常所做的是在周期性帧中将其状态发送给客户端。 Reactive-banana是创建GUI的最佳选择,因为GUI是纯粹的事件驱动模型,不能容忍时间泄漏。
在我看来,您可以同时使用两者,具体取决于您要实施的方面。