Помогает ли двухтактный FRP при реализации игр?

Я сравнивал только pull-only FRP (т.е. netwire) с push-pull FRP (т.е. реактивный банан) при реализации игр. Есть ли преимущества у одного перед другим? Вещи, которые я заметил:

  • Push-события упрощают создание событий для щелчков мышью/нажатий клавиш из GLFW или GLUT.
  • Arrowized FRP, который использует netwire, имеет гораздо меньше IO плавающего вокруг, что всегда лучше.
  • Похоже, что ответы только по запросу на такие вещи, как движение мыши, могут вызвать утечку времени.

Что еще я пропустил?

Отредактируйте, чтобы сделать это менее основанным на мнении: главная цель — сделать что-то максимально выразительное/краткое, без утечек времени.

Обновление: большая проблема, которую я обнаружил с Netwire, заключается в том, что, похоже, нет удобного способа иметь более одной частоты кадров, как описано в статье «Исправьте свой временной шаг».

Обновление 2: способ, которым я обошел это, состоит в том, чтобы заставить мою проводную симуляцию игры возвращать Float -> IO (), которая принимает альфа-значение и выполняет все вызовы GL со всем, что интерполируется этой альфой. В идеале я должен иметь возможность передать эту «функцию рисования» в другой поток через MVar и запустить ее в этом потоке. Чувак, Haskell — это круто.

Обновление 3. За шесть месяцев, прошедших после того, как я задал этот вопрос, я разработал простой движок рендеринга. a> основанный на Netwire и концепции «программирования сущностных компонентов». В этом процессе я на самом деле не нашел использование FRP очень полезным. Выразительность Wires фактически оказалась помехой в некоторых обстоятельствах. Проблема сосредоточена вокруг «идентичности» объектов. При определении значения типа Wire оно не имеет идентичности, т. е. может повторно использоваться во всей сети несколько раз и каждый раз представлять разные физические объекты. Это огромная боль, когда вы хотите сделать что-то вроде обнаружения столкновений и не можете пройти по графу сцены, потому что он не может существовать без слияния в один непрозрачный провод. Эта проблема не возникает в "игрушечных" примерах, потому что легко точно указать, какие свойства каких объектов и каким образом взаимодействуют с другими объектами. Я считаю, что это проблема с любым типом FRP.

Было бы здорово, если бы какой-нибудь волшебник Haskell доказал, что я ошибаюсь, но я не вижу способа обойти это. Также мне жаль, если объяснение не очень хорошее, но на самом деле это не так просто понять, не попробовав самостоятельно.


person Dan    schedule 16.12.2013    source источник


Ответы (1)


Из того, что я могу прочитать здесь и здесь, Netwire и reactive-banana имеют разные цели и задачи. Netwire специализируется на моделировании кадровых сигналов, таких как игровой сервер, потому что обычно игровой сервер отправляет свое состояние клиенту в периодических кадрах. Reactive-banana был бы лучшим выбором для создания графического интерфейса, потому что графический интерфейс — это чисто модель, управляемая событиями, и она не терпима к утечке времени.

Мне кажется, вы можете использовать оба, в зависимости от того, какой аспект вы хотите реализовать.

person Arthur Hv    schedule 19.02.2014
comment
Интересный. Совместимы ли они друг с другом? То есть, можете ли вы передавать информацию от одного к другому? - person Dan; 25.02.2014
comment
После того, как я использовал netwire в игровом движке, я могу сказать, что он отлично подходит для этой цели по указанным вами причинам. - person Dan; 19.06.2014