Embora eu saiba que linguagens funcionais não são as mais usadas para escrever jogos, há muitos benefícios associados a elas que parecem interessantes em qualquer contexto de programação. Especialmente a facilidade de paralelização que eu acho que poderia ser muito útil, pois o foco está se movendo em direção a mais e mais processadores.
Além disso, com o F # como um novo membro da família .NET, ele pode ser usado diretamente com o XNA, por exemplo, o que diminui bastante o limite, em oposição a LISP, Haskell, Erlang, etc.
Se alguém tem experiência em escrever jogos com código funcional, quais foram os pontos positivos e negativos? Para que era adequado, o que não?
Edit: Achando difícil decidir que existe uma única resposta boa para isso, por isso é provavelmente mais adequado como um post no wiki da comunidade.
fonte
Respostas:
Atualmente, estou trabalhando em um jogo em Haskell. Não posso falar de programação funcional em geral, mas de Haskell especificamente:
O bom
Essas são as coisas impressionantes que fazem Haskell realmente se destacar.
O mal
Estas são coisas que não são boas, mas pode ser contornado sem muito muito esforço.
O feio
São coisas que exigiriam um esforço considerável para serem superadas.
fonte
Passei o último ano desenvolvendo um mecanismo de jogo comercial em Haskell e, para nós, a experiência foi extremamente positiva. Nosso mundo dos jogos é complexo, e Haskell facilitou a modelagem do processo de conversão de um formato de editor para um formato de mecanismo de jogo. Eu odiaria pensar como seria esse código em uma linguagem imperativa.
Ocasionalmente, vazamentos de espaço surgem e, embora tenham causado alguns problemas, no esquema geral, tem sido uma quantidade pequena (por exemplo, em comparação com a localização de impasses em projetos Java de tamanho semelhante) e, uma vez corrigidos , eles ficaram fixos.
Estamos usando o FRP semelhante ao Yampa, e certamente há uma curva de aprendizado associada a ele, mas, uma vez terminada, a experiência é muito positiva. As bibliotecas não foram um problema para nós - tudo o que precisávamos estava disponível. Atrasos na coleta de lixo foram um problema específico, pois se trata de uma plataforma incorporada. Usamos C ++ para gerenciar a animação. O desempenho também foi um problema, por ser uma plataforma incorporada (= processador lento). Fizemos C e também estamos olhando para as tecnologias Haskell emergentes como acelerar. O animador C ++ foi uma decisão de design desde o início e os locais onde o código é muito lento são apenas áreas muito pequenas. A longo prazo, queremos traduzir todo o nosso C para Haskell.
Haskell facilitou um trabalho difícil, e todas as dificuldades que acabei de mencionar foram pequenas em comparação com a grande quantidade de código complexo que produzimos que é limpo, sustentável e praticamente inquebrável. O paralelismo será um problema no desenvolvimento de jogos muito em breve, e estamos extremamente bem posicionados para lidar com isso. Parte do que eu disse pode não se aplicar a pequenos projetos, porque estamos nisso a longo prazo; portanto, os custos de inicialização, como curvas de aprendizado, suporte à biblioteca etc., são muito menos problemáticos.
fonte
Dave menciona alguns pontos excelentes, embora eu deva ressaltar que Haskell resolveu os dois problemas. A apatridia pode ser contornada usando a mônada do estado (EDIT: na verdade não - veja abaixo para obter detalhes) , e o seqüenciamento pode ser tratado usando a mônada de E / S (EDIT: ou qualquer outra mônada, para esse assunto ...) .
Os desafios que você terá (e que eu tentei aprender programação de jogos e Haskell) são mais nesse sentido. (Estes são todos específicos de Haskell, já que ainda não me aprofundou em nenhuma outra linguagem FP).
O outro lado disso é que as coisas estão melhorando rapidamente. E tudo realmente depende do que você deseja da experiência. Você quer criar um jogo e colocá-lo em seu site para buscar fama e fortuna? Fique com C ++ ou Python. Mas se você quiser aprender algo novo que exigirá que você inove seus processos, tente uma linguagem funcional. Apenas tenha muita paciência consigo mesmo enquanto estiver aprendendo.
Antti Salonen tem um blog interessante detalhando seu caso de novo com a programação de jogos Haskell. Vale a pena ler.
Editar (um ano depois): Agora que estudei mais a mônada do estado, percebo que não é uma solução particularmente boa para o estado que se destina a persistir fora de uma função específica. As soluções reais para apatridia são encontradas em Haskell em IOVar, ST, MVar (para segurança do encadeamento) ou através de algo como o Yampa, que usa Arrows e FRP para gerenciar o estado interno que, no entanto, está oculto ao desenvolvedor. (Esta lista está em ordem de dificuldade, embora os três primeiros não sejam particularmente difíceis depois que você entender as mônadas.)
fonte
Caml objetivo!
O uso de linguagens funcionais pode ser uma grande vantagem na maioria dos tipos de desenvolvimento de software, principalmente porque eles reduzem consideravelmente o tempo de desenvolvimento. Percebo um grande potencial para escrever um servidor back-end em um jogo, ou as camadas de IA e lógica no cliente, em uma linguagem funcional. E como todos sabem, o LISP foi usado para scripts de NPC.
Se eu tentasse escrever o frontend de um jogo em uma linguagem funcional, eu definitivamente optaria pelo Objective Caml , que é uma linguagem híbrida. É um descendente de ML, e permite misturar estilos iterativos e funcionais, possui um sistema objetivo com objetos com estado. (Caml é a linguagem na qual o F # é modelado.)
As ligações do OpenGL parecem funcionar perfeitamente e as pessoas criam jogos no OCaml há muito tempo. O idioma pode ser compilado e é potencialmente muito rápido (ele conquistou o C em alguns benchmarks há muito tempo, não como as coisas estão agora).
Há também toneladas de bibliotecas. Tudo, desde ciência da computação a encadernações, a todos os tipos de bibliotecas.
fonte
Não é realmente uma resposta para nada, mas sinto que uma discussão sobre programação de jogos em linguagens funcionais está incompleta sem mencionar a Programação Reativa Funcional (FRP) - http://www.haskell.org/frp/ - e sua implementação mais comum ( Eu acho?), YAMPA - http://www.haskell.org/yampa/ .
fonte
Quanto aos benefícios, confira a biblioteca de jogos limpos (http://cleangl.sourceforge.net/) e o jogo de plataformas. Depois de entender a sintaxe (encorajo você a tentar), você verá a pura elegância das construções e a proximidade com a qual a fonte é mapeada para os conceitos que estão expressando. Como um bônus adicional, a abstração do estado e a necessidade de transmitir explicitamente o estado tornam seu código muito mais amigável para vários núcleos.
Por outro lado, requer uma grande mudança de paradigma. Muito do que você costuma fazer sem pensar nisso de repente não existe mais e você ficará intrigado sobre como resolvê-lo, simplesmente porque está pensando nos padrões errados.
fonte
Do meu ponto de vista, os maiores desafios serão:
(begin...
" no esquema plt).Sinta-se à vontade para estender esta lista (e talvez adicionar alguns pontos positivos ^^).
fonte
Você pode escrever seu código em C / C ++ e usar uma linguagem incorporada, como Embedded Common Lisp, para seus scripts. Embora seja difícil fazer com que eles sejam compilados em uma plataforma diferente. Você pode consultar o Lisp In Small Pieces para aprender a escrever sua própria linguagem de script. Realmente não é tão difícil, se você tiver tempo.
fonte
Escrevi jogos simples no LISP e foi divertido, mas não algo que eu recomendaria. A programação funcional é sobre o resultado final. Portanto, é muito útil para processar dados e tomar decisões, mas achei difícil fazer código limpo simples como um loop de controle básico.
Embora eu não tenha aprendido F #, pode ser muito mais fácil trabalhar com isso.
fonte
o positivo seria desempenho e portabilidade e o negativo seria o gerenciamento da complexidade , hoje os jogos são seriamente complexos e precisam de ferramentas ou linguagem de programação que possam gerenciar melhor a complexidade, como metodologia orientada a objetos ou programação genérica que é difícil de implementar na programação funcional língua.
fonte