Obwohl ich weiß, dass funktionale Sprachen nicht die am häufigsten zum Schreiben von Spielen verwendeten sind, gibt es eine Reihe von Vorteilen, die in jedem Programmierkontext interessant erscheinen. Besonders die Leichtigkeit der Parallelisierung könnte meiner Meinung nach sehr nützlich sein, da der Fokus auf immer mehr Prozessoren gerichtet ist.
Mit F # als neuem Mitglied der .NET-Familie kann es auch direkt mit XNA verwendet werden, wodurch der Schwellenwert erheblich gesenkt wird, im Gegensatz zu LISP, Haskell, Erlang usw.
Wenn jemand Erfahrung mit dem Schreiben von Spielen mit funktionalem Code hat, was hat sich als positiv und negativ herausgestellt? Wofür war es geeignet, wofür nicht?
Bearbeiten: Es fällt schwer zu entscheiden, ob es eine gute Antwort dafür gibt. Daher ist es wahrscheinlich besser als Community-Wiki-Beitrag geeignet.
quelle
Antworten:
Ich arbeite gerade an einem Spiel in Haskell. Ich kann nicht allgemein für funktionale Programmierung sprechen, sondern speziell für Haskell:
Der gute
Dies sind die großartigen Dinge, die Haskell wirklich auszeichnen.
Das Schlechte
Das sind Dinge , die nicht gut sind , aber um ohne gearbeitet werden zu viel Aufwand.
Das hässliche
Dies sind Dinge, deren Überwindung erhebliche Anstrengungen erfordern würde.
quelle
Ich habe das letzte Jahr damit verbracht, eine kommerzielle Spiel-Engine in Haskell zu entwickeln, und für uns waren die Erfahrungen überwiegend positiv. Unsere Spielewelt ist komplex und Haskell hat es einfach gemacht, den Konvertierungsprozess von einem Editor-Format in ein Game-Engine-Format zu modellieren. Ich würde es hassen zu überlegen, wie dieser Code in einer imperativen Sprache aussehen würde.
Gelegentlich sind Speicherplatzlecks aufgetreten, und obwohl sie einige Probleme verursacht haben, waren sie im allgemeinen Schema nur geringfügig (z. B. im Vergleich zum Auffinden von Deadlocks in Java-Projekten ähnlicher Größe) und wurden behoben blieben sie fest.
Wir verwenden FRP ähnlich wie Yampa, und es ist sicherlich eine Lernkurve damit verbunden, aber wenn das vorbei ist, ist die Erfahrung sehr positiv. Bibliotheken waren für uns kein Problem - alles, was wir brauchten, war verfügbar. Verzögerungen bei der Speicherbereinigung waren ein besonderes Problem, da es sich um eine eingebettete Plattform handelt. Wir haben C ++ zum Verwalten der Animation verwendet. Leistung war auch ein Problem, da dies eine eingebettete Plattform (= langsamer Prozessor) ist. Wir haben einige C gemacht und wir suchen auch nach neuen Haskell-Technologien wie Accelerate. Der C ++ - Animator war schon früh eine Designentscheidung und die Stellen, an denen der Code zu langsam ist, sind nur sehr kleine Bereiche. Langfristig wollen wir unser gesamtes C in Haskell übersetzen.
Haskell hat eine schwierige Aufgabe leicht gemacht, und all die Schwierigkeiten, die ich gerade erwähnt habe, waren im Vergleich zu der großen Menge an komplexem Code, der sauber, wartbar und praktisch unzerbrechlich ist, winzig. Parallelität wird in Kürze ein Thema in der Spieleentwicklung sein, und wir sind sehr gut in der Lage, damit umzugehen. Einige meiner Aussagen treffen möglicherweise nicht auf kleine Projekte zu, da wir uns auf lange Sicht in diesem Bereich befinden. Daher sind Startkosten wie Lernkurven, Bibliotheksunterstützung usw. weitaus weniger ein Problem.
quelle
Dave erwähnt einige hervorragende Punkte, obwohl ich darauf hinweisen muss, dass Haskell beide Probleme gelöst hat. Die Zustandslosigkeit kann mit der State-Monade umgangen werden (EDIT: nicht wirklich - siehe unten für Details) , und die Sequenzierung kann mit der IO-Monade (EDIT: oder jeder anderen Monade für diese Angelegenheit ...) durchgeführt werden .
Die Herausforderungen, die Sie haben (und bei denen ich versucht habe, sowohl Spieleprogrammierung als auch Haskell zu erlernen), liegen eher in dieser Richtung. (Diese sind alle Haskell-spezifisch, da ich noch keine anderen FP-Sprachen beherrsche.)
Die Kehrseite davon ist, dass sich die Dinge schnell verbessern. Und es hängt wirklich alles davon ab, was Sie aus der Erfahrung heraus wollen. Sie möchten ein Spiel erstellen und es auf Ihre Website stellen, um nach Ruhm und Reichtum zu suchen? Bleib bei C ++ oder Python. Wenn Sie jedoch etwas Neues lernen möchten, bei dem Sie Ihre Prozesse innovieren müssen, probieren Sie eine funktionale Sprache aus. Hab einfach viel Geduld mit dir selbst, während du lernst.
Antti Salonen hat ein interessantes Blog, in dem er ausführlich über seine Affäre mit der Programmierung von Haskell-Spielen berichtet. Es lohnt sich zu lesen.
Bearbeiten (ein Jahr später): Nachdem ich die staatliche Monade genauer studiert habe, ist mir klar, dass dies keine besonders gute Lösung für einen Staat ist, der außerhalb einer bestimmten Funktion bestehen bleiben soll. Die wirklichen Lösungen für Staatenlosigkeit finden sich in Haskell in IOVar, ST, MVar (für Threadsicherheit) oder über Yampa, das mithilfe von Arrows und FRP den internen Status verwaltet, der dem Entwickler jedoch verborgen bleibt. (Diese Liste ist nach Schwierigkeitsgrad geordnet, obwohl die ersten drei nicht besonders schwierig sind, wenn Sie die Monaden verstehen.)
quelle
Ziel Caml!
Die Verwendung funktionaler Sprachen kann bei den meisten Arten der Softwareentwicklung von großem Vorteil sein, vor allem, weil sie die Entwicklungszeit erheblich verkürzen. Ich sehe ein großes Potenzial für das Schreiben eines Server-Backends für ein Spiel oder der KI- und Logik-Ebenen auf dem Client in einer funktionalen Sprache. Und wie jeder weiß, wurde LISP für NPC-Skripte verwendet.
Wenn ich versuchen würde, das Frontend eines Spiels in einer funktionalen Sprache zu schreiben, würde ich mich definitiv für Objective Caml entscheiden , eine hybride Sprache. Es ist ein ML-Nachkomme und ermöglicht es, iterative und funktionale Stile zu mischen. Es hat ein objektives System mit statusbehafteten Objekten. (Caml ist die Sprache, der F # nachempfunden ist.)
OpenGL-Bindungen scheinen einwandfrei zu funktionieren, und die Leute haben lange Zeit Spiele in OCaml gemacht. Die Sprache kann kompiliert werden und ist möglicherweise sehr schnell (sie hat C in einigen Benchmarks vor langer Zeit berühmt gemacht, nicht wie es jetzt aussieht).
Es gibt auch Tonnen von Bibliotheken. Alles von Informatik bis hin zu Bindungen für alle Arten von Bibliotheken.
quelle
Keine wirkliche Antwort auf irgendetwas, aber ich bin der Meinung, dass eine Diskussion über Spielprogrammierung in funktionalen Sprachen unvollständig ist, ohne dass Functional Reactive Programming (FRP) - http://www.haskell.org/frp/ - und seine häufigste Implementierung erwähnt werden ( Ich denke?), YAMPA - http://www.haskell.org/yampa/ .
quelle
Informationen zu den Vorteilen finden Sie in der Clean Game Library (http://cleangl.sourceforge.net/) und im Platformer-Spiel. Sobald Sie sich mit der Syntax vertraut gemacht haben (ich empfehle Ihnen, es zu versuchen), werden Sie sehen, wie elegant die Konstrukte sind und wie genau die Quellen den Konzepten entsprechen, die sie ausdrücken. Als zusätzlichen Vorteil macht die Abstraktion des Zustands und die Notwendigkeit, den Zustand explizit weiterzugeben, Ihren Code viel mehrkerniger.
Andererseits erfordert es einen großen Paradigmenwechsel. Vieles, was Sie gewohnt sind, ohne darüber nachzudenken, existiert plötzlich nicht mehr und Sie werden sich wundern, wie Sie es lösen können, einfach weil Sie in den falschen Mustern denken.
quelle
Aus meiner Sicht werden die größten Herausforderungen sein:
(begin...
" im PLT-Schema).Fühlen Sie sich frei, diese Liste zu erweitern (und vielleicht einige positive Punkte hinzuzufügen ^^).
quelle
Sie können Ihren Code in C / C ++ schreiben und eine eingebettete Sprache wie Embedded Common Lisp für Ihre Skripterstellung verwenden. Obwohl es schwierig sein kann, diese auf einer anderen Plattform zu kompilieren. Sie können sich Lisp In Small Pieces ansehen, um zu lernen, wie Sie Ihre eigene Skriptsprache schreiben. Es ist wirklich nicht so schwer, wenn Sie die Zeit haben.
quelle
Ich habe einfache Spiele in LISP geschrieben und es hat Spaß gemacht, aber nichts, was ich empfehlen würde. Bei der funktionalen Programmierung dreht sich alles um das Endergebnis. Es ist also sehr praktisch, um Daten zu verarbeiten und Entscheidungen zu treffen, aber ich fand es schwierig, einfachen, sauberen Code wie einen einfachen Regelkreis zu erstellen.
Ich habe F # nicht gelernt, daher ist es möglicherweise viel einfacher, damit zu arbeiten.
quelle
Das Positive wäre Leistung und Portabilität, und das Negative wäre das Verwalten von Komplexität . Spiele sind heutzutage sehr komplex und benötigen Tools oder Programmiersprachen, die die Komplexität besser verwalten können, wie objektorientierte Methoden oder generische Programme, die in der funktionalen Programmierung schwer zu implementieren sind Sprache.
quelle