函数式编程语言是否适合图形编程?

时间:2012-03-18 04:01:35

标签: clojure functional-programming lisp

对此非常好奇,从我自己的经验来看,所有的图形编程似乎都与C或C ++有关。像Direct10X一样。函数式编程语言是否提供某种图形库来开发视频游戏?

3 个答案:

答案 0 :(得分:79)

您可以使用函数式语言进行图形/游戏编程,就像使用任何其他语言一样。

这只是一个简单的游戏,但我在Clojure中写了Ironclad: Steam Legions作为游戏开发功能编程的练习。

以下是我学到的一些课程/使用Clojure进行游戏编程的一般观察:

  • 您需要小心性能,因为游戏要求非常苛刻,而且功能语言确实会产生一些开销。对于大多数游戏来说,Clojure当然“足够好”,但你需要知道保持代码优化的技巧。例如,函数式语言可能会产生大量的GC,从而产生大量临时对象。您需要学习诀窍以避免这种情况(例如,以避免创建新序列对象的方式使用reduce,或利用原始算法)

  • 可变性在游戏中非常有用。例如,如果您正在使用物理或平滑动画做任何事情,那么您经常会有很多不断变化的对象。你可以 使用功能/不可变数据结构来模拟它,但如果你关心性能,那不是一个好主意。因此,有必要了解如何使用函数式语言获取可变数据,即使它不是惯用的(例如在Clojure中,您可能希望使用Java数组)

  • 不可变的持久性数据结构实际上在游戏中也非常有用。在Ironclad中,整个游戏状态存储在一个不可变的数据结构中。这允许一些很酷的技巧,比如有效地快照游戏状态/即时撤消/及时倒退。

  • Clojure对游戏脚本非常棒。动态特性加上运行时编译以及使用宏定义任意DSL的能力是一个巨大的胜利。事实上,即使我使用像Java这样的OOP语言编写游戏,我也会认真考虑使用Clojure(或其他Lisp)编写脚本。

  • Clojure对于交互式开发非常棒。我经常发现自己在一个窗口中运行游戏,同时在REPL中破解正在运行的代码。改变游戏数据结构并立即看到效果很有趣! This awesome video还让您体验Clojure式开发的可能性。

  • 在Clojure中,至少你会经常想要使用 Java库来显示图形,例如用于3D的2D或LWJGL的Swing。在某些情况下,这些包装已经存在,但我发现直接从Clojure中使用它们很容易。毕竟,Java互操作就像(.methodName object arg1 arg2)

  • 一样简单

总之,我认为函数式语言是游戏开发的完美选择,除了性能密集型游戏之外,为了更好地直接控制硬件,你仍然可能会更好地使用C / C ++。

答案 1 :(得分:19)

这是一个关于这个主题的好系列:( 4部分)Purely Functional Retrogames。你可以在Clojure中采用这种方法,并使用底层的Java游戏库来操作图形。

答案 2 :(得分:5)

可能没有人关心这个现在五岁的问题,也许甚至不是原来的提问者。但作为一个旧时代的Lisp插图家伙,我想要权衡。标题提到“图形编程”然后问题是关于游戏开发的库。值得注意的是,图形编程包含许多与游戏编程无关的主题。 (例如,在Clojure中进行数据可视化将是“适用于图形编程的函数式编程语言”的一个例子,而不是游戏编程。)基于函数的语言之间也有区别(比如Lisp,其中一切都是函数,但是允许副作用)和仅具有不可变数据类型(如Haskell或Clojure)的纯函数语言。

当然,基于Lisp的图形系统以“多范式”风格编写,也就是说,不是纯粹的功能/不可变。例如,我在20世纪80年代早期在Symbolics工作,当时我们完全用Lisp制作了第一个“数字内容创建”(如Maya或AutoCAD)系统。我1978年的硕士论文是关于一个基于Lisp的特定领域的程序动画语言,称为ASAS。我们在Triple-I(信息国际公司)使用它来做早期的CGI工作,用于电影中的特效,包括1982年的TRON。 (这在SIGGRAPH paper中有描述。)最后,游戏工作室Naughty Dog用一种名为Game Oriented Assembly Lisp(GOAL)的Scheme灵感语言编写了几个游戏(Crash Bandicoot,Jak和Daxter系列?)的游戏逻辑。

谈到更现代化的努力,以及更严格的功能/不可变语言:“LambdaCube 3D是用于编程GPU(图形处理单元)的类似Haskell的纯功能域特定语言。”

在John Carmack在2013年Quakecon的主题演讲中,他广泛谈论了(大约30分钟)关于他对游戏开发的纯功能语言的兴趣和实验。他的观点似乎是使用函数式编程有明显的好处,但是存在一些挑战,并且他在这条道路上没有走得太远以获得强烈的意见。他谈到了试验Haskell和Lisp。本主题介于此video的1:17:00-1:49:00之间。