Dan*_*Dan 26 haskell frp reactive-banana netwire
我一直在比较拉动式FRP(即netwire)和推拉式FRP(即反应性 - 香蕉)在游戏的实施中.一个优于另一个有优势吗?我注意到的事情是:
IO
漂浮,这总是更好.我还错过了什么?
编辑,以减少基于意见:主要目标是尽可能具有表达/简洁的东西,没有时间泄漏.
更新:我发现Netwire的一个大问题是,似乎没有一种方便的方法来获得多个帧速率,如"修复你的时间步"一文中所述.
更新2:我解决这个问题的方法是让我的游戏模拟线返回一个Float -> IO ()
获取alpha值并使用该alpha插值的所有GL调用.理想情况下,我应该能够通过一个"绘制函数"传递给另一个线程MVar
并在该线程中运行它.男人,哈斯克尔太棒了.
更新3:在提出这个问题后的六个月里,我开发了一个基于Netwire 的简单渲染引擎,以及"实体组件编程"的概念.在这个过程中,我实际上没有发现使用FRP非常有用.Wire
在某些情况下,s 的表现力实际上已成为障碍.问题集中在对象的"身份"上.在定义Wire
类型的值时,它没有标识,即它可以在整个网络中多次重复使用,并且每次表示不同的物理事物.当你想要做一些像碰撞检测这样的事情并且无法遍历场景图时,这是一个巨大的痛苦,因为它不能在不融合成单根不透明线的情况下存在.在"玩具"示例中不会出现此问题,因为很容易准确指定哪些对象与哪些其他对象以哪种方式交互.我相信这是任何一种FRP的问题.
如果一些Haskell向导在这方面证明我错了,那将是很棒的,但我真的没有看到它的方法.此外,如果解释不是很好,我很抱歉,但如果不自己尝试,这并不容易理解.
从我在这里和那里读到的内容来看,Netwire和reactive-banana有不同的目的和目标。Netwire 专门对帧信号进行建模,例如游戏服务器,因为游戏服务器通常所做的是以周期性帧将其状态发送到客户端。Reactive-banana 将是创建 GUI 的更好选择,因为 GUI 是纯粹的事件驱动模型,并且不能容忍时间泄漏。
在我看来,您可以同时使用两者,具体取决于您想要实现的方面。