ゲームの実装において、プルのみの FRP (ネットワイヤ) とプッシュプル FRP (リアクティブ バナナ) を比較してきました。お互いに利点はありますか?私が気づいたことは次のとおりです。
- プッシュ イベントにより、GLFW または GLUT からのマウス クリック/キー プレスのイベントを簡単に作成できます。
- netwire が使用する矢印化された FRP は
IO
、浮遊がはるかに少なく、常に優れています。 - マウスの動きなどに対してプルのみの応答を行うと、タイム リークが発生する可能性があるようです。
私は他に何を逃しましたか?
編集して、これを意見に基づかないようにします。主な目標は、時間の漏れなく、できるだけ表現力豊かで簡潔なものにすることです。
更新:私が Netwire で見つけた大きな問題は、記事「Fix your Timestep」で説明されているように、複数のフレームレートを使用する便利な方法がないように思われることです。
更新 2:これを回避する方法は、ゲーム シミュレーション ワイヤFloat -> IO ()
がアルファ値を取得し、そのアルファによって補間されたすべてのものですべての GL 呼び出しを実行する a を返すようにすることです。理想的には、この「描画関数」を を介して別のスレッドに渡しMVar
、そのスレッドで実行できるようにする必要があります。男、Haskellは素晴らしいです。
更新 3:この質問をしてから 6 か月間で、Netwire と「エンティティ コンポーネント プログラミング」の概念に基づく単純なレンダリング エンジンを開発しました。このプロセスでは、FRP の使用が非常に役立つとは思いませんでした。sの表現力は、Wire
実際には状況によっては妨げになることがわかっています。問題は、オブジェクトの「アイデンティティ」に集中しています。の値を定義するときWire
つまり、ネットワーク全体で複数回再利用され、毎回異なる物理的なものを表す可能性があります。衝突検出のようなことをしたいが、シーン グラフをトラバースする方法がない場合、これは非常に苦痛です。シーン グラフは単一の不透明なワイヤに融合されなければ存在できないからです。この問題は、「おもちゃ」の例では発生しません。これは、どのオブジェクトのどのプロパティが他のどのオブジェクトとどのように相互作用するかを正確に指定するのは簡単だからです。これはどちらのFRPにも問題があると思います。
Haskell のウィザードがこれについて私が間違っていることを証明してくれたら最高ですが、実際にはそれを回避する方法がわかりません。また、説明が下手で申し訳ありませんが、自分で試してみないと簡単には理解できません。