2012-03-18 60 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之間。