虽然我知道功能语言并不是游戏编写中最常用的语言,但与它们相关的许多好处似乎使它们在任何编程环境中都非常有趣。特别是当我将注意力集中在越来越多的处理器上时,我认为并行的简易性将非常有用。
另外,将F#作为.NET系列的新成员,它可以直接与XNA一起使用,与使用LISP,Haskell,Erlang等相反,它可以大大降低阈值。
如果有人有使用功能代码编写游戏的经验,那么正面和负面是什么呢?它适合什么,不适合什么?
编辑:很难确定对此有一个好的答案,因此它可能更适合作为社区Wiki帖子。
虽然我知道功能语言并不是游戏编写中最常用的语言,但与它们相关的许多好处似乎使它们在任何编程环境中都非常有趣。特别是当我将注意力集中在越来越多的处理器上时,我认为并行的简易性将非常有用。
另外,将F#作为.NET系列的新成员,它可以直接与XNA一起使用,与使用LISP,Haskell,Erlang等相反,它可以大大降低阈值。
如果有人有使用功能代码编写游戏的经验,那么正面和负面是什么呢?它适合什么,不适合什么?
编辑:很难确定对此有一个好的答案,因此它可能更适合作为社区Wiki帖子。
Answers:
我目前正在Haskell从事游戏。我不能说一般的函数式编程,但是特别是对于Haskell:
这些都是让Haskell真正脱颖而出的好东西。
这些都是不好的事情,但无需过多努力即可解决。
这些都是需要大量努力才能克服的事情。
去年,我花了很多时间在Haskell上开发了一款商业游戏引擎,对我们来说,这种体验是非常积极的。我们的游戏世界非常复杂,Haskell使建模从编辑器格式到游戏引擎格式的转换过程变得容易。我不愿意想到命令式语言中的代码是什么样的。
有时会出现空间泄漏,虽然它们引起了一些麻烦,但在一般方案中,泄漏量很小(例如,与在类似大小的Java项目中发现死锁相比),并且一旦修复,他们保持不变。
我们正在使用类似于Yampa的FRP,并且肯定有一个学习曲线,但是一旦结束,体验就会非常积极。图书馆对我们来说不是问题-我们所需要的一切都已经可用。垃圾收集延迟是一个特别的问题,因为它是针对嵌入式平台的。我们使用了一些C ++来管理动画。作为嵌入式平台(=慢速处理器),性能也是一个问题。我们已经完成了一些C的工作,并且还在研究新兴的Haskell技术,例如加速。C ++动画师很早就做出了设计决定,代码太慢的地方只有很小的一部分。从长远来看,我们希望将所有C转换为Haskell。
Haskell使困难的工作变得容易,与我们所产生的大量清晰,可维护且几乎坚不可摧的复杂代码相比,我刚才提到的所有困难都很小。并行性将很快成为游戏开发中的一个问题,我们非常有能力解决它。我说过的某些内容可能不适用于小型项目,因为从长远来看,这是我们的职责所在,因此,学习曲线,库支持等启动成本就不再是问题。
戴夫提到了一些出色的观点,尽管我必须指出,哈斯克尔已经解决了他的两个问题。可以使用State monad来绕过无状态(编辑:并非如此,有关详细信息,请参见下文),可以使用IO monad来处理排序(就此而言,可以使用EDIT:或任何其他monad ...)。
您所面临的挑战(以及我曾尝试学习游戏编程和Haskell的挑战)更多地沿着这些思路。(这些都是特定于Haskell的,因为我还没有深入了解任何其他FP语言。)
不利的一面是,事情正在迅速改善。这实际上取决于您想要从体验中获得什么。您想开发一款游戏并将其放在您的网站上以寻求名利吗?坚持使用C ++或Python。但是,如果您想学习一些需要创新的新知识,请尝试使用一种功能语言。在学习时,要对自己有很大的耐心。
Antti Salonen有一个有趣的博客,详细介绍了他与Haskell游戏编程的断断续续的关系。值得一读。
编辑(一年后):现在,我对State monad进行了更多研究,我意识到对于打算保留在特定功能之外的State来说,这不是一个特别好的解决方案。真正的无状态解决方案可在IOVar,ST,MVar(用于线程安全)的Haskell中找到,或通过类似Yampa的方法找到,Yampa使用Arrows和FRP管理仍然对开发人员隐藏的内部状态。(此列表是按难度顺序排列的,尽管一旦您理解了monad,前三个并不是特别困难。)
客观的骆驼!
在大多数类型的软件开发中,使用功能语言可能是一个巨大的优势,主要是因为它们大大缩短了开发时间。我可以看到用功能性语言将服务器后端写入游戏或客户端上的AI和逻辑层的巨大潜力。众所周知,LISP已用于NPC脚本编写。
如果我想用功能语言编写游戏的前端,那么我肯定会选择Objective Caml,它是一种混合语言。它是ML的后代,可以混合使用迭代式和函数式样式,并具有带有状态对象的客观系统。(Caml是F#建模的语言。)
OpenGL绑定似乎完美无缺,人们已经使用OCaml制作游戏很长时间了。该语言可以编译,而且速度可能非常快(很久以前,它在某些基准测试中胜过C语言,现在就不行了)。
也有大量的图书馆。从计算机科学到绑定各种库的一切。
并不能真正解决任何问题,但是我觉得在不提及函数式反应性编程(FRP)-http: //www.haskell.org/frp/的情况下,以功能语言进行游戏编程的讨论是不完整的-(我想?),YAMPA- http://www.haskell.org/yampa/。
我认为最大的挑战将是:
(begin...
plt方案中的“ ”)。随意扩展此列表(并添加一些积极点^^)。