Si bien sé que los lenguajes funcionales no son los más utilizados para escribir juegos, hay muchos beneficios asociados con ellos que parecen ser interesantes en cualquier contexto de programación. Especialmente la facilidad de paralelización, creo que podría ser muy útil ya que el enfoque se está moviendo hacia más y más procesadores.
Además, con F # como nuevo miembro de la familia .NET, se puede usar directamente con XNA, por ejemplo, lo que reduce el umbral bastante, en lugar de ir con LISP, Haskell, Erlang, etc.
Si alguien tiene experiencia escribiendo juegos con código funcional, ¿cuáles han sido los aspectos positivos y negativos? ¿Para qué era adecuado, qué no?
Editar: resulta difícil decidir que hay una buena respuesta única para esto, por lo que probablemente sea más adecuado como una publicación wiki de la comunidad.
fuente
Respuestas:
Actualmente estoy trabajando en un juego en Haskell. No puedo hablar de programación funcional en general, pero específicamente de Haskell:
El bueno
Estas son las cosas increíbles que hacen que Haskell realmente se destaque.
El malo
Estas son cosas que no son buenas pero que pueden solucionarse sin demasiado esfuerzo.
El feo
Estas son cosas que requerirían un esfuerzo considerable para superarlas.
fuente
Pasé el último año desarrollando un motor de juego comercial en Haskell, y para nosotros, la experiencia ha sido abrumadoramente positiva. Nuestro mundo de juegos es complejo, y Haskell ha facilitado modelar el proceso de conversión de un formato de editor a un formato de motor de juego. Odiaría pensar cómo se vería ese código en un lenguaje imperativo.
En ocasiones, han surgido pérdidas de espacio, y aunque han causado un poco de problemas, en el esquema general ha sido una pequeña cantidad (por ejemplo, en comparación con encontrar puntos muertos en proyectos Java de tamaño similar), y una vez que se repararon , se quedaron fijos.
Estamos usando FRP similar a Yampa, y ciertamente hay una curva de aprendizaje asociada con él, pero una vez que termina, la experiencia es muy positiva. Las bibliotecas no han sido un problema para nosotros: todo lo que hemos necesitado ha estado disponible. Los retrasos en la recolección de basura fueron un problema particular ya que es para una plataforma integrada. Hemos usado algunos C ++ para administrar la animación. El rendimiento también ha sido un problema, ya que se trata de una plataforma integrada (= procesador lento). Hemos hecho algo de C y también estamos buscando tecnologías emergentes de Haskell como acelerar. El animador de C ++ fue una decisión de diseño desde el principio y los lugares donde el código es demasiado lento son solo áreas muy pequeñas. A la larga, queremos traducir toda nuestra C a Haskell.
Haskell ha hecho un trabajo difícil fácil, y todas las dificultades que acabo de mencionar han sido pequeñas en comparación con la gran cantidad de código complejo que hemos producido que es limpio, mantenible y prácticamente irrompible. El paralelismo será un problema en el desarrollo del juego muy pronto, y estamos muy bien posicionados para enfrentarlo. Es posible que parte de lo que he dicho no se aplique a proyectos pequeños, porque estamos en esto a largo plazo, por lo que los costos iniciales como las curvas de aprendizaje, el soporte de la biblioteca, etc., son mucho menos problemáticos.
fuente
Dave menciona algunos puntos excelentes, aunque debo señalar que Haskell ha resuelto sus dos problemas. La apatridia se puede omitir usando la mónada del Estado (EDITAR: no realmente, ver más abajo para más detalles) , y la secuenciación se puede manejar usando la mónada IO (EDITAR: o cualquier otra mónada, para el caso ...) .
Los desafíos que tendrá (y que he tenido que tratar de aprender tanto la programación de juegos como Haskell) son más similares. (Todos estos son específicos de Haskell, ya que todavía no he profundizado en ningún otro lenguaje FP).
La otra cara de esto es que las cosas están mejorando rápidamente. Y realmente todo depende de lo que quieras de la experiencia. ¿Quieres construir un juego y ponerlo en tu sitio web para buscar fama y fortuna? Quédate con C ++ o Python. Pero si desea aprender algo nuevo que le obligue a innovar sus procesos, pruebe con un lenguaje funcional. Solo ten mucha paciencia contigo mismo mientras estás aprendiendo.
Antti Salonen tiene un blog interesante que detalla su aventura intermitente con la programación de juegos Haskell. Vale la pena leerlo.
Editar (un año después): ahora que he estudiado más la mónada estatal, me doy cuenta de que no es una solución particularmente buena para el estado que pretende persistir fuera de una función en particular. Las soluciones reales a la apatridia se encuentran en Haskell en IOVar, ST, MVar (para la seguridad de subprocesos), o a través de algo como Yampa, que usa Arrows y FRP para administrar el estado interno que, sin embargo, está oculto para el desarrollador. (Esta lista está en orden de dificultad, aunque las tres primeras no son particularmente difíciles una vez que comprenda las mónadas).
fuente
Objetivo Caml!
El uso de lenguajes funcionales puede ser una gran ventaja en la mayoría de los tipos de desarrollo de software, principalmente porque reducen considerablemente el tiempo de desarrollo. Puedo ver un gran potencial para escribir un servidor back-end para un juego, o las capas AI y lógica en el cliente, en un lenguaje funcional. Y como todos saben, LISP se ha utilizado para secuencias de comandos NPC.
Si tratara de escribir la interfaz de un juego en un lenguaje funcional, definitivamente elegiría Objective Caml , que es un lenguaje híbrido. Es un descendiente de ML, y permite mezclar estilos iterativos y funcionales, tiene un sistema objetivo con objetos con estado. (Caml es el idioma en el que se modela F #).
Los enlaces de OpenGL parecen funcionar perfectamente y la gente ha estado haciendo juegos en OCaml durante mucho tiempo. El lenguaje se puede compilar y es potencialmente muy rápido (hace mucho tiempo se ganó a C en algunos puntos de referencia, no sé cómo están las cosas ahora).
También hay toneladas de bibliotecas. Todo, desde material informático hasta enlaces y todo tipo de bibliotecas.
fuente
Realmente no es una respuesta a nada, pero siento que una discusión sobre la programación de juegos en lenguajes funcionales está incompleta sin mencionar la Programación Reactiva Funcional (FRP) - http://www.haskell.org/frp/ - y su implementación más común ( ¿Creo?), YAMPA - http://www.haskell.org/yampa/ .
fuente
En cuanto a los beneficios, echa un vistazo a Clean Game Library (http://cleangl.sourceforge.net/) y mira el juego de plataformas. Una vez que entienda la sintaxis (le animo a que lo intente) verá la pura elegancia de las construcciones y qué tan cerca se asigna la fuente a los conceptos que están expresando. Como una ventaja adicional, la abstracción del estado y la necesidad de pasar explícitamente el estado hace que su código sea mucho más amigable para múltiples núcleos.
Por otro lado, requiere un cambio de paradigma importante. Mucho de lo que estás acostumbrado a hacer sin pensar en eso de repente ya no existe y estarás pensando cómo resolverlo, simplemente porque estás pensando en los patrones incorrectos.
fuente
Desde mi punto de vista, los mayores desafíos serán:
(begin...
" en el esquema plt).Siéntase libre de extender esta lista (y quizás agregar algunos puntos positivos ^^).
fuente
Puede escribir su código en C / C ++ y usar un lenguaje incrustado como Embedded Common Lisp para sus secuencias de comandos. Aunque hacer que estos se compilen en una plataforma diferente puede ser difícil. Puede mirar Lisp In Small Pieces para aprender a escribir su propio lenguaje de secuencias de comandos. Realmente no es tan difícil, si tienes tiempo.
fuente
He escrito juegos simples en LISP y fue divertido, pero no es algo que recomendaría. La programación funcional tiene que ver con el resultado final. Por lo tanto, es muy útil para procesar datos y tomar decisiones, pero descubrí que era difícil hacer un código limpio simple como un bucle de control básico.
Sin embargo, no he aprendido F #, por lo que puede ser mucho más fácil trabajar con él.
fuente
lo positivo sería el rendimiento y la portabilidad y lo negativo sería la gestión de la complejidad , los juegos de hoy son muy complejos y necesitan herramientas o lenguaje de programación que puedan gestionar mejor la complejidad, como la metodología orientada a objetos o la programación genérica que es difícil de implementar en la programación funcional idioma.
fuente