Bien que je sache que les langages fonctionnels ne sont pas les langages les plus couramment utilisés pour l'écriture de jeux, ils présentent de nombreux avantages qui semblent intéressants dans n'importe quel contexte de programmation. Je pense que la facilité de la parallélisation pourrait être très utile, car nous nous concentrons sur de plus en plus de processeurs.
De plus, avec F # en tant que nouveau membre de la famille .NET, il peut être utilisé directement avec XNA, par exemple, ce qui abaisse un peu le seuil, par opposition à LISP, Haskell, Erlang, etc.
Si quelqu'un a de l'expérience dans l'écriture de jeux avec du code fonctionnel, quels sont les avantages et les inconvénients? Pour quoi était-il adapté, quoi non?
Edit: Trouver qu'il est difficile de décider qu'il existe une seule bonne réponse à cette question est probablement mieux adapté en tant que publication dans un wiki de communauté.
la source
Réponses:
Je travaille actuellement sur un jeu à Haskell. Je ne peux pas parler de la programmation fonctionnelle en général, mais de Haskell en particulier:
Le bon
Ce sont les choses impressionnantes qui font que Haskell se démarque vraiment.
Le mauvais
Ce sont des choses qui ne sont pas bonnes mais qui peuvent être contournées sans trop d'effort.
Le moche
Ce sont des choses qui nécessiteraient des efforts considérables à surmonter.
la source
Au cours de la dernière année, j'ai développé un moteur de jeu commercial à Haskell. Pour nous, l'expérience a été extrêmement positive. Notre monde de jeu est complexe et Haskell a facilité la modélisation du processus de conversion d’un format d’éditeur à un format de moteur de jeu. Je détesterais penser à quoi ce code ressemblerait dans un langage impératif.
Des fuites d’espace ont parfois été signalées, et bien qu’elles aient causé quelques problèmes, dans l’ensemble, elles ont été modestes (par exemple, par rapport à des impasses dans des projets Java de taille similaire) et une fois résolus , ils sont restés fixes.
Nous utilisons un PRF semblable à Yampa, et il y a certes une courbe d'apprentissage associée, mais une fois que c'est terminé, l'expérience est très positive. Les bibliothèques ne nous ont pas posé de problème - tout ce dont nous avions besoin était disponible. Les retards de la collecte des ordures posaient un problème particulier, car ils concernaient une plate-forme intégrée. Nous avons utilisé du C ++ pour gérer l'animation. La performance a également été un problème avec cela étant une plate-forme intégrée (= processeur lent). Nous avons fait du C et nous étudions également les technologies Haskell émergentes telles que l'accélération. L'animateur C ++ était une décision de conception très tôt et les endroits où le code est trop lent ne sont que de très petites zones. À long terme, nous voulons traduire tous nos C en Haskell.
Haskell a rendu le travail difficile facile, et toutes les difficultés que je viens de mentionner ont été minimes par rapport à la grande quantité de code complexe que nous avons produit, propre, maintenable et pratiquement incassable. Le parallélisme sera très prochainement un problème dans le développement de jeux, et nous sommes extrêmement bien placés pour le gérer. Une partie de ce que j'ai dit peut ne pas s'appliquer à de petits projets, car nous sommes sur le long terme, donc les coûts de démarrage tels que les courbes d'apprentissage, le soutien des bibliothèques, etc., sont beaucoup moins problématiques.
la source
Dave mentionne d'excellents points, bien que je dois souligner que Haskell a résolu ses deux problèmes. L'apatridie peut être contournée à l'aide de la monade d'état (EDIT: pas vraiment - voir ci-dessous pour plus de détails) , et le séquencement peut être traité à l'aide de la monade IO (EDIT: ou de toute autre monade, d'ailleurs ...) .
Les défis que vous aurez à relever (et sur lesquels j’ai essayé d’apprendre la programmation de jeux et Haskell) vont plus dans ce sens. (Celles-ci sont toutes spécifiques à Haskell, étant donné que je n'ai pas encore approfondi d'autres langages de PF.)
Le revers de la médaille, c’est que les choses s’améliorent rapidement. Et tout dépend vraiment de ce que vous voulez de l'expérience. Vous voulez créer un jeu et le mettre sur votre site Web pour rechercher la gloire et la fortune? Tenez-vous en C ++ ou en Python. Mais si vous voulez apprendre quelque chose de nouveau qui nécessitera d'innover vos processus, essayez un langage fonctionnel. Ayez juste beaucoup de patience avec vous pendant que vous apprenez.
Antti Salonen a un blog intéressant qui détaille sa liaison avec la programmation de jeux Haskell. Cela vaut la peine d'être lu.
Edit (un an plus tard): Maintenant que j’ai étudié la monade d’État de plus en plus, je me rends compte que ce n’est pas une bonne solution pour un état destiné à persister en dehors d’une fonction particulière. Les solutions réelles à l'apatridie se trouvent dans Haskell dans IOVar, ST, MVar (pour la sécurité des threads), ou via quelque chose comme Yampa, qui utilise Arrows et FRP pour gérer un état interne qui est néanmoins masqué par le développeur. (Cette liste est en ordre de difficulté, bien que les trois premiers ne soient pas particulièrement difficiles une fois que vous avez compris les monades.)
la source
Objective Caml!
L'utilisation de langages fonctionnels peut être un avantage énorme dans la plupart des types de développement logiciel, principalement parce qu'ils réduisent considérablement le temps de développement. Je peux voir un grand potentiel pour écrire un back-end de serveur dans un jeu, ou les couches d'IA et de logique sur le client, dans un langage fonctionnel. Et comme tout le monde le sait, LISP a été utilisé pour les scripts NPC.
Si j'essayais d'écrire l'interface d'un jeu dans un langage fonctionnel, je choisirais certainement Objective Caml , un langage hybride. C'est un descendant de ML, qui permet de mélanger des styles itératifs et fonctionnels, possède un système objectif avec des objets dynamiques. (Caml est le langage sur lequel F # est modelé.)
Les liaisons OpenGL semblent fonctionner parfaitement et les gens créent des jeux dans OCaml depuis longtemps. La langue peut être compilée et est potentiellement très rapide (il est célèbre que C a été conquis il y a longtemps par certains points de repère, mais comment les choses se passent-elles maintenant).
Il y a aussi des tonnes de bibliothèques. De l'informatique aux liaisons à toutes sortes de bibliothèques.
la source
Ce n’est pas vraiment une réponse, mais j’ai l’impression qu’une discussion sur la programmation de jeux en langage fonctionnel est incomplète sans mentionner la programmation réactive fonctionnelle (FRP) - http://www.haskell.org/frp/ - et sa mise en œuvre la plus courante ( Je pense?), YAMPA - http://www.haskell.org/yampa/ .
la source
En ce qui concerne les avantages, consultez Clean Game Library (http://cleangl.sourceforge.net/) et consultez le jeu de plateforme. Une fois que vous avez compris la syntaxe (je vous encourage à essayer), vous verrez toute l'élégance des constructions et à quel point la source correspond aux concepts qu'ils expriment. De plus, l'abstraction de l'état et la nécessité de le passer explicitement rendent votre code beaucoup plus convivial.
D'autre part, cela nécessite un changement de paradigme majeur. Une grande partie de ce que vous avez l'habitude de faire sans y penser n'existe soudainement plus et vous aurez du mal à le résoudre, tout simplement parce que vous pensez de manière erronée.
la source
De mon point de vue, les plus grands défis seront:
(begin...
" dans le schéma Plt).N'hésitez pas à étendre cette liste (et peut-être à ajouter des points positifs ^^).
la source
Vous pouvez écrire votre code en C / C ++ et utiliser un langage incorporé tel que Embedded Common Lisp pour vos scripts. Bien que les compiler sur une plate-forme différente puisse être difficile. Vous pouvez regarder Lisp In Small Pieces pour apprendre à écrire votre propre langage de script. Ce n'est vraiment pas si difficile, si vous avez le temps.
la source
J'ai écrit des jeux simples dans LISP et c'était amusant mais ce n'est pas quelque chose que je recommanderais. La programmation fonctionnelle est tout au sujet du résultat final. C'est donc très pratique pour traiter des données et prendre des décisions, mais j'ai trouvé qu'il était difficile de faire du code propre et simple, comme une boucle de contrôle de base.
Je n’ai pas appris le F #, alors c’est peut-être beaucoup plus facile de travailler avec.
la source
les aspects positifs seraient la performance et la portabilité et les aspects négatifs, la gestion de la complexité . Les jeux d'aujourd'hui sont très complexes et nécessitent des outils ou un langage de programmation permettant de mieux gérer la complexité, tels que la méthodologie orientée objet ou la programmation générique, difficile à implémenter en programmation fonctionnelle. la langue.
la source