函数式编程语言是否适合graphics编程?
只是非常好奇,从我自己的经验来看,所有的graphics编程似乎都与C或C ++相关。 像Direct10X一样。 函数式编程语言是否提供某种graphics库来开发video游戏?
您可以像使用其他语言一样使用函数式语言来进行graphics/游戏编程。
这只是一个简单的游戏,但我写了Ironclad: Clojure中的蒸汽军团 ,作为游戏开发函数式编程的练习。
下面是我学习的一些教训/关于使用Clojure进行游戏编程的一般观察:
-
游戏的性能要求非常高,function性语言会带来一些开销,所以需要注意性能 。 对于大多数游戏来说,Clojure肯定是“够好的”,但是你需要知道如何保持代码优化的技巧。 例如,函数式语言可能会产生大量的GC,产生大量的临时对象。 您需要学习这些技巧来避免这种情况(例如,以避免创build新序列对象或利用原始算术的方式使用reduce)
-
可变性在游戏中很有用。 例如,如果您正在做物理或平滑animation的任何事情,您经常会有很多对象不断变化的位置。 你可以用function/不可变的数据结构模拟这个,但如果你关心性能,这不是一个好主意。 因此,值得一提的是如何在函数式语言中获取可变数据,即使它不是惯用的(例如在Clojure中,你可能会想使用Java数组)
-
不变的持久数据结构实际上在游戏中也是非常有用的。 在Ironclad中,整个游戏状态被存储在一个不可变的数据结构中。 这允许一些很酷的技巧,如有效地快照游戏状态/即时撤销/及时倒退。
-
Clojure 对游戏脚本非常棒 。 与运行时编译相结合的dynamic特性以及用macros定义任意DSL的能力是一个巨大的胜利。 事实上,即使我正在用Java这样的OOP语言编写游戏,我也会认真考虑使用Clojure(或其他Lisp)来编写脚本。
-
Clojure 对于交互式开发非常棒 。 我经常发现自己在一个窗口中运行游戏,同时在REPL中同时攻击正在运行的代码。 改变游戏数据结构很有趣,并立即看到效果! 这真棒video也给你一个Clojure风格的发展可能的味道。
-
在Clojure中,至less你会经常想用graphics库的Java库 ,例如Swing for 2D或者LWJGL for 3D。 在某些情况下,这些包装已经存在,但是我发现从Clojure直接使用它们是很容易的。 毕竟Java互操作就像
(.methodName object arg1 arg2)
一样简单,
总之,我认为function语言对于游戏开发来说是非常好的select,除了性能密集型的游戏之外,为了更直接地控制硬件,您仍然可以更好地使用C / C ++。
这是一个很好的系列主题:(4部分) 纯function逆转游戏 。 你可以在Clojure中使用这个方法,并使用底层的Java游戏库来操纵graphics。
也许没有人关心这个现在五年的问题,甚至可能不是原来的提问者。 但作为一个老式的graphics在Lisp的家伙,我想权衡。标题提到“graphics编程”,然后问题问游戏开发图书馆。 值得注意的是,graphics编程包含许多与游戏编程无关的主题。 (例如,在Clojure中进行数据可视化将是“适用于graphics编程的函数式编程语言”的一个例子,而不是游戏编程。)基于函数的语言也是有区别的(比如Lisp,一切都是函数,但是副作用是允许的)和纯粹的function只有不可变数据types的语言(如Haskell或Clojure)。
基于Lisp的graphics系统肯定有“多范式”的风格,也就是说,不是纯粹的function/不可变的。 例如,我在20世纪80年代早期在Symbolics工作,当时我们完全在Lisp中制作了第一个“数字内容创作”(如Maya或AutoCAD)系统之一。 我1978年的硕士论文是关于程序性animationASAS的基于Lisp的领域特定语言。 我们用Triple-I(Information International Inc.)在包括1982年的TRON在内的专题片中做了非常早期的CGI工作。 (这是在SIGGRAPH 论文中描述的)。最后,游戏工作室Naughty Dog用一种名为面向游戏的组装Lisp(GOAL)的Scheme语言编程了几个游戏(Crash Bandicoot,Jak和Daxter系列?)的游戏逻辑。
谈到更现代的努力,更严格的function/不可变的语言:“LambdaCube 3D是类似Haskell的纯function领域专用语言编程的GPU(graphics处理单元)”。
在John Carmack 2013年Quakecon的主题演讲中,他广泛谈了(约30分钟)关于他对纯游戏开发function语言的兴趣和实验。 他的观点似乎是使用函数式编程有显而易见的好处,但也有一些挑战,而且他还没有走得太远,没有强烈的意见。 他谈到了用Haskell和Lisp做实验。 本主题介于1:17:00-1:49:00之间。