cas*_*iel 38 lisp functional-programming clojure
对此非常好奇,从我自己的经验来看,所有的图形编程似乎都与C或C++有关.像Direct10X一样.函数式编程语言是否提供某种图形库来开发视频游戏?
mik*_*era 79
您可以使用函数式语言进行图形/游戏编程,就像使用任何其他语言一样.
这只是一个简单的游戏,但我在Clojure中写了Ironclad:Steam Legions,作为游戏开发的函数式编程练习.
以下是我学到的一些课程/使用Clojure进行游戏编程的一般观察:
你需要小心性能,因为游戏可能非常苛刻,而函数式语言确实会产生一些开销.对于大多数游戏来说,Clojure当然"足够好",但你需要知道保持代码优化的技巧.例如,函数式语言可能会产生大量的GC,从而产生大量临时对象.您需要学习诀窍以避免这种情况(例如,以避免创建新序列对象或利用原始算法的方式使用reduce)
可变性在游戏中很有用.例如,如果您正在使用物理或平滑动画做任何事情,那么您经常会有很多不断变化的对象.您可以使用功能/不可变数据结构来模拟这一点,但如果您关心性能,那么这不是一个好主意.因此,值得了解如何使用函数式语言获取可变数据,即使它不是惯用的(例如在Clojure中,您可能希望使用Java数组)
不可变的持久数据结构实际上也证明在游戏中非常有用.在Ironclad中,整个游戏状态存储在一个不可变的数据结构中.这允许一些很酷的技巧,比如有效地快照游戏状态/即时撤消/及时倒退.
Clojure非常适合游戏脚本.动态特性加上运行时编译以及使用宏定义任意DSL的能力是一个巨大的胜利.事实上,即使我用像Java这样的OOP语言编写游戏,我也会认真考虑使用Clojure(或其他Lisp)编写脚本.
Clojure 对于交互式开发来说非常棒.我经常发现自己在一个窗口中运行游戏,同时在REPL中破解正在运行的代码.改变游戏数据结构并立即看到效果很有趣!这个精彩的视频还让您体验Clojure风格的开发.
至少在Clojure中,您经常需要将Java库用于图形,例如用于2D的Swing或用于3D的LWJGL.在某些情况下,这些包装已经存在,但我发现直接从Clojure中使用它们很容易.毕竟,Java interop就像(.methodName object arg1 arg2)
总而言之,我认为函数式语言是游戏开发的完美选择,除了性能密集型游戏之外,为了更好地直接控制硬件,你仍然可以更好地使用C/C++.
也许没有人关心这个已有五年历史的问题,甚至根本没有在乎。但是,作为一个老套的Lisp图形用户,我想权衡一下。标题提到“图形编程”,然后问题询问游戏开发库。值得注意的是,图形编程包括许多与游戏编程无关的主题。(因此,例如在Clojure中进行数据可视化将是“适用于图形编程的功能编程语言”的示例,而不是游戏编程的示例。)基于功能的语言之间也存在区别(例如Lisp,其中一切都是功能,但允许副作用)以及仅具有不可变数据类型(例如Haskell或Clojure)的纯粹功能的语言。
当然,已经有基于Lisp的图形系统以“多范式”样式编写,也就是说,并非纯粹是功能/不变的。例如,我在1980年代初期在Symbolics工作,当时我们完全用Lisp制作了第一个“数字内容创建”系统(如Maya或AutoCAD)。我在1978年的MS论文是关于基于Lisp的过程动画ASAS的特定语言。我们在Triple-I(Information International Inc.)中使用它来进行早期CGI工作,以拍摄包括1982年的TRON在内的故事片中的特殊效果。(在SIGGRAPH 论文中对此进行了描述。)最后,游戏工作室Naughty Dog使用一种称为Scheme Oriented Assembly Lisp(GOAL)的受方案启发的语言来编程了多个游戏(Crash Bandicoot,Jak和Daxter系列?)的游戏逻辑。
谈到更多的现代化工作以及更严格的功能/不变语言:“ LambdaCube 3D是类似于Haskell的纯功能领域特定语言,用于对GPU(图形处理单元)进行编程。”
在约翰·卡马克(John Carmack)在Quakecon 2013上的主题演讲中,他广泛地(约30分钟)谈论了他的兴趣以及使用纯功能语言进行游戏开发的实验。他的观点似乎是,使用函数式编程显然有好处,但是存在一些挑战,而且他在这条道路上走得还不够远,无法发表强烈的意见。他谈到了对Haskell和Lisp进行试验的经验。这个主题是1:在这个00:17:00-1:49 视频。