在游戏的实现中,我一直在比较仅拉式FRP(即netwire)和推拉式FRP(即反应性香蕉)。彼此之间有优势吗?我注意到的是:

  • 推送事件使来自GLFW或GLUT的鼠标单击/按键事件变得很容易
  • 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向导在这方面证明我错了,那就太好了,但我真的没有办法解决它。我也很抱歉,如果解释不是很好,但是如果不亲自尝试就很难理解。

    最佳答案

    据我所知herethereNetwirereactive-banana具有不同的目的和目标。 Netwire专门研究诸如游戏服务器之类的帧信号的建模,因为游戏服务器通常所做的是定期将其状态发送给客户端。反应性香蕉将是创建GUI的更好选择,因为GUI是纯粹的事件驱动模型,并且不容许时间泄漏。

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

    关于haskell - 实现游戏时,推拉式FRP是否有帮助?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20602341/

    10-10 00:33