在游戏的实现中,我一直在比较仅拉式FRP(即netwire)和推拉式FRP(即反应性香蕉)。彼此之间有优势吗?我注意到的是:
IO
float ,这总是更好。 我还错过了什么?
编辑,使基于意见的观点减少:主要目标是使内容尽可能具有表达力/简洁性,而不会浪费时间。
更新:我在Netwire上发现的一个大问题是,似乎没有一种便捷的方法来获得多个帧速率,如“固定时间步长”一文中所述。
更新2:我解决这个问题的方法是使我的游戏模拟连线返回一个
Float -> IO ()
,该MVar
接受alpha值,并使用该alpha插入的所有内容进行所有GL调用。理想情况下,我应该能够通过Wire
将“绘制函数”传递到另一个线程中并在该线程中运行它。伙计,Haskell很棒。更新3:在问了这个问题以来的六个月中,我围绕Netwire开发了simple rendering engine,并提出了“实体组件编程”的概念。在此过程中,我实际上并未发现使用FRP会带来极大帮助。实际上,在某些情况下
Wire
的表现力是一个障碍。问题围绕对象的“身份”。在定义ojit_code类型的值时,它没有身份,即可以在整个网络中多次使用,并且每次都代表不同的物理事物。当您想执行诸如碰撞检测之类的操作并且无法遍历场景图时,这是一个巨大的痛苦,因为如果不将其融合到一条不透明的导线中就无法存在场景图。在“玩具”示例中不会发生此问题,因为很容易specify exactly哪些对象的哪些属性与哪些其他对象以哪种方式进行交互。我相信这是任何一种FRP的问题。如果某些Haskell向导在这方面证明我错了,那就太好了,但我真的没有办法解决它。我也很抱歉,如果解释不是很好,但是如果不亲自尝试就很难理解。
最佳答案
据我所知here和there,Netwire和reactive-banana具有不同的目的和目标。 Netwire专门研究诸如游戏服务器之类的帧信号的建模,因为游戏服务器通常所做的是定期将其状态发送给客户端。反应性香蕉将是创建GUI的更好选择,因为GUI是纯粹的事件驱动模型,并且不容许时间泄漏。
在我看来,您可以同时使用这两种方法,具体取决于要实现的方面。
关于haskell - 实现游戏时,推拉式FRP是否有帮助?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20602341/