2013-12-16 8 views
25

Porównywałem FRP tylko do ciągnięcia (np. Netwire) z FRP typu push-pull (tj. Reaktywną bannaną) w implementacji gier. Czy jedna z drugiej ma jakieś zalety? Czego mam zawiadomienia są:Czy pomoc w zakresie push-pull FRP jest pomocna podczas wdrażania gier?

  • wydarzenia push ułatwiają mają wydarzenia kliknięć myszką/naciśnięć klawiszy z GLFW lub GLUT
  • Arrowized FRP że netwire zastosowań jest znacznie mniej IO pływających wokół, co jest zawsze lepsze .
  • Wygląda na to, że reakcje typu "tylko pociągnięcie" na ruchy myszy mogą spowodować upływ czasu.

Co jeszcze przegapiłem?

Edytuj, aby uzyskać mniej oparte na opiniach: Głównym celem jest posiadanie czegoś tak ekspresyjnego/zwięzłego, jak to możliwe, bez upływu czasu.

Aktualizacja: „naprawić swój krok czasowy” Duży problem z Netwire znalazłem jest to, że nie wydaje się być wygodny sposób, aby mieć więcej niż jedną framerate, jak opisano w artykule

Aktualizacja 2: Sposób stałam się wokół to jest aby mój przewód symulacji gra zwrócić Float -> IO() że przyjmuje wartość alfa i robi wszystko GL wzywa z tego wszystkiego interpolowana przez alfa. Idealnie powinienem móc przekazać tę "funkcję rysowania" do innego wątku poprzez MVar i uruchomić ją w tym wątku. Człowieku, Haskell jest niesamowity.

Update 3: W ciągu sześciu miesięcy od zadając to pytanie, opracowałem simple rendering engine opiera się Netwire i pojęcie „podmiot-komponent programowania”. W tym procesie faktycznie nie znalazłem wykorzystania FRP, aby być strasznie pomocnym. Zdolność ekspresji Wire s faktycznie okazała się przeszkodą w niektórych okolicznościach. Problem koncentruje się wokół "tożsamości" obiektów. Definiując wartość typu Wire, nie ma ona tożsamości, tj. Może być wielokrotnie używana w całej sieci i reprezentować różne fizyczne rzeczy za każdym razem. Jest to ogromny problem, gdy chcemy zrobić coś takiego jak wykrywanie kolizji i nie mamy możliwości przejścia przez wykres sceny, ponieważ nie może istnieć bez połączenia w jeden nieprzezroczysty przewód. Ten problem nie występuje w przykładach "zabawek", ponieważ łatwo jest uzyskać specify exactly, których właściwości wchodzą w interakcje z innymi obiektami, na których przedmiotach. Uważam, że jest to problem z którymkolwiek typem FRP.

Byłoby wspaniale, gdyby jakiś czarodziej Haskell udowodnił mi, że się mylę, ale tak naprawdę nie widzę sposobu, żeby go obejść. Przykro mi, jeśli wyjaśnienie nie jest wspaniałe, ale nie jest to łatwe do zrozumienia bez samodzielnego wypróbowania.

Odpowiedz

2

Z tego, co mogę przeczytać, here i there, Netwire i reactive-banana mają różne cele i cele. Netwire specjalizuje się w modelowaniu sygnałów w ramkach, takich jak serwer gier, ponieważ zazwyczaj serwer gry wysyła swoje dane do klienta w okresowych ramkach. Banan reaktywny byłby lepszym wyborem do stworzenia GUI, ponieważ GUI jest modelem opartym wyłącznie na zdarzeniach i nie toleruje upływu czasu.

Wydaje mi się, że możesz użyć obu, w zależności od tego, który aspekt chcesz zaimplementować.

+0

Interesujące. Czy są ze sobą kompatybilne? Czy można przenosić informacje z jednego do drugiego? – Dan

+0

Po użyciu netwire w silniku gry, mogę powiedzieć, że jest doskonale dostosowany do tego celu, z powodów, które podałeś. – Dan

Powiązane problemy