2012-03-18 89 views
38

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

+0

http://www.haskell.org/haskellwiki/Research_papers/Functional_reactive_programming – 2012-03-20 17:56:12

回答

78

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

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

这里有一些教训我学到/使用Clojure的游戏编程一般性意见:

  • 你需要小心性能如游戏是非常苛刻和功能性语言做强加一些开销。 Clojure对于大多数游戏来说肯定是“足够好的”,但你需要知道这些技巧来保持代码的优化。例如,功能语言可能会产生大量的GC,产生大量的临时对象。你需要学习的招数,以避免这种情况(例如,使用降低以避免产生新的序列对象,或利用原始artithmetic的方式)

  • 可变性是在游戏中非常有用。例如,如果您正在做物理或平滑动画的任何事情,则通常会有许多对象具有不断变化的位置。你可以模拟这与功能/不可变的数据结构,但如果你关心性能这不是一个好主意。因此,它是值得找出如何让可变数据在你的函数式语言,即使它不是地道的(例如,在Clojure中,你可能会想利用Java数组)的

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

  • Clojure是真棒游戏脚本。动态性与运行时编译以及用宏定义任意DSLs的能力是一个巨大的胜利。事实上,即使我正在用Java等OOP语言编写游戏,我也会认真考虑使用Clojure(或其他Lisp)进行脚本编写。

  • Clojure是真棒交互式开发。我经常发现自己在一个窗口中运行游戏,同时在REPL中同时侵入运行代码。改变游戏数据结构并立即看到效果很有趣! This awesome video也让您体验到Clojure风格发展的可能性。

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

总之,我认为函数式语言进行游戏开发非常不错的选择,具有非常性能密集型游戏之外你仍然可能是更好的地方C/C++,以便更直接地控制硬件。

+0

感谢ü非常多,你的答案是非常周到细致 – castiel 2012-03-18 06:52:35

+1

真的,真的引人入胜的视频。 – Voo 2012-03-18 13:39:48

+0

@Mikera,如果可能的话,当你谈论不可变的数据结构时,你能否详细说明“时间倒退”的含义? – endbegin 2012-03-19 00:02:20

19

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

+0

该系列产品是非常有趣的,感谢ü – castiel 2012-03-18 05:00:46

3

也许没人关心这个现在五年的问题,也许连最初的提问者都不在乎。但作为一个老式的图形在Lisp的人,我想权衡。标题提到“图形编程”,然后问题问游戏开发图书馆。值得注意的是图形编程包含许多与游戏编程无关的主题。 (例如,在Clojure中进行数据可视化将是“适用于图形编程的函数式编程语言”的一个例子,但不是游戏编程。)基于函数的语言也是有区别的(比如Lisp,其中一切都是函数,但副作用是允许的)和纯粹的功能只有不可变数据类型的语言(如Haskell或Clojure)。

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

谈到更现代化的努力,以及更严格的功能/一成不变的语言:“LambdaCube 3D是哈斯克尔式编程的GPU(图形处理单元)纯功能性领域特定语言。”

在约翰·卡马克的基调在Quakecon 2013期间,他广泛谈了(约30分钟)关于他对游戏开发的纯粹功能语言的兴趣和实验。他的观点似乎是使用函数式编程有明显的好处,但也有一些挑战,并且他没有走得太远,没有强烈的意见。他谈到了对Haskell和Lisp的实验。本主题介于video之间的1:17:00-1:49:00之间。