Chociaż wiem, że języki funkcjonalne nie są najczęściej używane do pisania gier, wiąże się z nimi wiele korzyści, które wydają się interesujące w każdym kontekście programowania. Zwłaszcza łatwość równoległości, jak sądzę, może być bardzo przydatna, ponieważ skupia się na coraz większej liczbie procesorów.
Ponadto, dzięki F # jako nowemu członkowi rodziny .NET, można go używać bezpośrednio na przykład z XNA, co znacznie obniża próg, w przeciwieństwie do LISP, Haskell, Erlang itp.
Jeśli ktoś ma doświadczenie w pisaniu gier z kodem funkcjonalnym, co okazało się pozytywne i negatywne? Do czego był przeznaczony, a co nie?
Edycja: Trudno jest zdecydować, że jest na to jedna dobra odpowiedź, więc prawdopodobnie lepiej nadaje się jako post na wiki społeczności.
źródło
Odpowiedzi:
Obecnie pracuję nad grą w Haskell. Ogólnie nie mogę mówić o programowaniu funkcjonalnym, ale konkretnie w przypadku Haskell:
Dobry
To niesamowite rzeczy, które sprawiają, że Haskell naprawdę się wyróżnia.
Źli
Są to rzeczy, które nie są dobre, ale można obejść bez zbyt wiele wysiłku.
Brzydki
Są to rzeczy, których pokonanie wymagałoby dużego wysiłku.
źródło
Ostatni rok spędziłem na opracowywaniu komercyjnego silnika gry w Haskell, a dla nas doświadczenie było zdecydowanie pozytywne. Nasz świat gier jest złożony, a Haskell ułatwił modelowanie procesu konwersji z formatu edytora do formatu silnika gry. Nie chciałbym myśleć, jak wyglądałby ten kod w języku imperatywnym.
Czasami pojawiały się przecieki kosmiczne i chociaż spowodowały trochę problemów, w ogólnym schemacie było to niewielkie (na przykład w porównaniu ze znalezieniem impasu w projektach Java o podobnej wielkości), a po ich naprawieniu , pozostały nieruchome.
Używamy FRP podobnego do Yampy iz pewnością wiąże się z tym krzywa uczenia się, ale kiedy to się skończy, doświadczenie jest bardzo pozytywne. Biblioteki nie stanowiły dla nas problemu - wszystko, czego potrzebowaliśmy, było dostępne. Opóźnienia związane z odśmiecaniem pamięci były szczególnym problemem, ponieważ dotyczy to wbudowanej platformy. Użyliśmy trochę C ++ do zarządzania animacją. Problemem była także wydajność, ponieważ jest to platforma wbudowana (= wolny procesor). Zrobiliśmy trochę C i przyglądamy się również nowym technologiom Haskell, takim jak przyspieszenie. Animator C ++ był wczesną decyzją projektową, a miejsca, w których kod jest zbyt wolny, to tylko bardzo małe obszary. Na dłuższą metę chcemy przetłumaczyć całe nasze C na Haskell.
Haskell sprawił, że trudna praca stała się łatwa, a wszystkie trudności, o których właśnie wspomniałem, były niewielkie w porównaniu z dużą ilością złożonego kodu, który stworzyliśmy, który jest czysty, łatwy do utrzymania i prawie niezniszczalny. Równoległość będzie wkrótce problemem w rozwoju gier i jesteśmy wyjątkowo dobrze przygotowani, aby sobie z tym poradzić. Niektóre z tego, co powiedziałem, mogą nie mieć zastosowania do małych projektów, ponieważ jesteśmy w tym na dłuższą metę, więc koszty początkowe, takie jak krzywe uczenia się, wsparcie biblioteki itp., Są znacznie mniejszym problemem.
źródło
Dave wspomina o kilku znakomitych punktach, chociaż muszę zaznaczyć, że Haskell rozwiązał oba jego problemy. Bezpaństwowość można obejść za pomocą monady państwowej (EDYCJA: nie bardzo - szczegóły poniżej) , a sekwencjonowanie można obsłużyć za pomocą monady IO (EDYCJA: lub dowolna inna monada, jeśli o to chodzi ...) .
Wyzwania, które będziesz miał (i że próbowałem nauczyć się programowania gier i Haskell), są bardziej podobne. (Wszystkie są specyficzne dla Haskell, ponieważ tak naprawdę nie zagłębiłem się jeszcze w żadne inne języki FP).
Drugą stroną tego jest to, że rzeczy szybko się poprawiają. A tak naprawdę wszystko zależy od tego, czego chcesz od tego doświadczenia. Chcesz zbudować grę i umieścić ją na swojej stronie, aby szukać sławy i fortuny? Trzymaj się C ++ lub Pythona. Ale jeśli chcesz nauczyć się czegoś nowego, co wymagać będzie innowacji w swoich procesach, wypróbuj funkcjonalny język. Po prostu miej dużo cierpliwości do siebie podczas nauki.
Antti Salonen ma interesujący blog opisujący jego romans z programowaniem gier Haskell. Warto przeczytać.
Edycja (rok później): Teraz, gdy bardziej przestudiowałem monadę państwową, zdaję sobie sprawę, że nie jest to szczególnie dobre rozwiązanie dla stanu, który ma pozostać poza określoną funkcją. Prawdziwe rozwiązania bezpaństwowości można znaleźć w Haskell w IOVar, ST, MVar (dla bezpieczeństwa wątków) lub poprzez coś takiego jak Yampa, który używa Arrows i FRP do zarządzania stanem wewnętrznym, który jest jednak ukryty przed deweloperem. (Ta lista jest uporządkowana według stopnia trudności, choć pierwsze trzy nie są szczególnie trudne, gdy zrozumiesz monady).
źródło
Obiektywny Caml!
Używanie języków funkcjonalnych może być ogromną zaletą w większości rodzajów tworzenia oprogramowania, głównie dlatego, że znacznie skracają czas programowania. Widzę duży potencjał do napisania zaplecza serwera do gry lub warstw sztucznej inteligencji i logiki na kliencie w funkcjonalnym języku. I jak wszyscy wiedzą, LISP został wykorzystany do tworzenia skryptów NPC.
Gdybym miał spróbować napisać frontend gry w funkcjonalnym języku, zdecydowanie wybrałbym Objective Caml , który jest językiem hybrydowym. Jest potomkiem ML i pozwala łączyć style iteracyjne i funkcjonalne, ma system obiektywny z obiektami stanowymi. (Caml to język, w którym modelowany jest F #).
Wydaje się, że wiązania OpenGL działają bez zarzutu, a ludzie tworzą gry w OCaml od dłuższego czasu. Język można skompilować i jest on potencjalnie bardzo szybki (dawno już dawno wygrał z C w niektórych testach porównawczych, nie wiem, jak teraz wygląda sytuacja).
Istnieje również mnóstwo bibliotek. Wszystko, od informatyki po powiązania i wszelkiego rodzaju biblioteki.
źródło
Naprawdę nie jest to odpowiedź na nic, ale wydaje mi się, że dyskusja na temat programowania gier w językach funkcjonalnych jest niepełna bez wzmianki o Functional Reactive Programming (FRP) - http://www.haskell.org/frp/ - i jego najczęstszej implementacji ( Myślę, że?), YAMPA - http://www.haskell.org/yampa/ .
źródło
Jeśli chodzi o korzyści, sprawdź Clean Game Library (http://cleangl.sourceforge.net/) i sprawdź grę platformową. Po obejrzeniu składni (zachęcam do wypróbowania) zobaczysz czystą elegancję konstruktów i to, jak ściśle źródło mapuje koncepcje, które wyrażają. Jako dodatkowy bonus abstrakcja stanu i konieczność jawnego przekazywania stanu sprawia, że kod jest bardziej przyjazny dla wielu rdzeni.
Z drugiej strony wymaga to znacznej zmiany paradygmatu. Wiele z tego, co robiłeś bez myślenia o tym nagle, już nie istnieje i będziesz zastanawiać się, jak to rozwiązać, po prostu dlatego, że myślisz w niewłaściwy sposób.
źródło
Z mojego punktu widzenia największymi wyzwaniami będą:
(begin...
” w schemacie plt).Nie krępuj się rozszerzyć tę listę (i być może dodać kilka pozytywnych punktów ^^).
źródło
Możesz napisać swój kod w C / C ++ i użyć języka wbudowanego, takiego jak Embedded Common Lisp, do pisania skryptów. Chociaż kompilowanie ich na innej platformie może być trudne. Możesz spojrzeć na Lisp In Small Pieces, aby nauczyć się pisać własny język skryptowy. To naprawdę nie jest takie trudne, jeśli masz czas.
źródło
Napisałem proste gry w LISP i było fajnie, ale nie polecam tego. W programowaniu funkcjonalnym chodzi o efekt końcowy. Jest to więc bardzo przydatne do przetwarzania danych i podejmowania decyzji, ale stwierdziłem, że utrudniało to wykonanie prostego, czystego kodu, takiego jak podstawowa pętla kontrolna.
Nie nauczyłem się F #, więc może być o wiele łatwiej pracować.
źródło
pozytywem byłaby wydajność i przenośność, a negatywnym byłoby zarządzanie złożonością , dzisiejsza gra jest bardzo złożona i potrzebuje narzędzi lub języka programowania, który lepiej poradzi sobie ze złożonością, takich jak metodologia obiektowa lub programowanie ogólne, które trudno jest zaimplementować w programowaniu funkcjonalnym język.
źródło