FRP push-pull помогает при реализации игр?
В реализации игр я сравнивал FRP "только по запросу" (то есть по сети) с FRP "по запросу" (то есть с реактивной связью). Есть ли преимущества одного над другим? Вот что я заметил:
- Push-события позволяют легко получать события для щелчков мыши / нажатий клавиш из GLFW или GLUT
- Arrowized FRP, который использует сеть, имеет гораздо меньше
IO
плавать вокруг, что всегда лучше. - Похоже, что реакция только на тягу на такие вещи, как движение мыши, может привести к утечке времени.
Что еще я пропустил?
Отредактируйте, чтобы сделать это менее основанным на мнении: главная цель - сделать что-то настолько выразительное / лаконичное, насколько это возможно, без утечек времени.
Обновление: большая проблема, которую я обнаружил с Netwire, заключается в том, что, похоже, нет удобного способа иметь более одной частоты кадров, как описано в статье "Исправьте свой временной шаг".
Обновление 2: способ, которым я справился, состоит в том, чтобы заставить мой игровой симулятор вернуть Float -> IO ()
он принимает значение альфа и выполняет все вызовы GL со всем, что интерполируется этой альфа. В идеале я должен быть в состоянии передать эту "функцию рисования" в другой поток через MVar
и запустить его в этой теме. Чувак, Хаскелл потрясающий.
Обновление 3: За шесть месяцев с момента постановки этого вопроса я разработал простой движок рендеринга, основанный на Netwire, и концепцию "программирования сущностей и компонентов". В этом процессе я фактически не нашел, что использование FRP было бы очень полезным. Выразительность Wire
На самом деле, s оказался препятствием в некоторых обстоятельствах. Проблема сосредоточена вокруг "идентичности" объектов. При определении значения Wire
тип, он не имеет идентичности, то есть он может многократно использоваться в общей сети и каждый раз представлять разные физические вещи. Это огромная боль, когда вы хотите сделать что-то вроде обнаружения столкновений, и у вас нет возможности пройти через граф сцены, потому что он не может существовать без слияния в один непрозрачный провод. Эта проблема не возникает в "игрушечных" примерах, поскольку легко указать, какие именно свойства каких объектов взаимодействуют с какими другими объектами и каким образом. Я считаю, что это проблема с любым типом FRP.
Было бы здорово, если бы какой-нибудь волшебник из Хаскелла доказал мне, что я не прав, но я не вижу в этом никакого пути. Также я извиняюсь, если объяснение не велико, но это не так просто понять, не пытаясь сделать это самостоятельно.
1 ответ
Из того, что я могу прочитать здесь и там, Netwire и реактивный банан имеют разные цели и задачи. NETwire специализируется на моделировании кадровых сигналов, таких как игровой сервер, потому что игровой сервер обычно отправляет свое состояние клиенту в периодических кадрах. Reactive-banana был бы лучшим выбором для создания GUI, потому что GUI - это чисто управляемая событиями модель, которая не терпит утечки времени.
Мне кажется, вы можете использовать оба, в зависимости от того, какой аспект вы хотите реализовать.