簡體   English   中英

函數式編程語言是否適合圖形編程?

[英]Are functional programming languages suitable for graphics programming?

對此非常好奇,從我自己的經驗來看,所有的圖形編程似乎都與C或C ++有關。 像Direct10X一樣。 函數式編程語言是否提供某種圖形庫來開發視頻游戲?

您可以使用函數式語言進行圖形/游戲編程,就像使用任何其他語言一樣。

這只是一個簡單的游戲,但我在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互操作就像(.methodName object arg1 arg2)一樣簡單

總而言之,我認為函數式語言是游戲開發的完美選擇,除了性能密集型游戲之外,為了更好地直接控制硬件,你仍然可以更好地使用C / C ++。

這是一個關於這個主題的好系列:( 4部分) 純功能逆向游戲 您可以在Clojure中使用此方法並使用底層Java游戲庫來操作圖形。

可能沒有人會關心這個現在五年前的問題,也許甚至不是原來的提問者。 但作為一個舊時代的Lisp插圖家伙,我想要權衡。標題提到“圖形編程”然后問題是關於游戲開發的庫。 值得注意的是,圖形編程包含許多與游戲編程無關的主題。 (例如,在Clojure中進行數據可視化將是“適用於圖形編程的函數式編程語言”的一個例子,而不是游戲編程。)基於函數的語言之間也有區別(比如Lisp,其中一切都是函數,但是允許副作用)和僅具有不可變數據類型(如Haskell或Clojure)的純函數語言。

當然,基於Lisp的圖形系統以“多范式”風格編寫,也就是說,不是純粹的功能/不可變。 例如,我在20世紀80年代早期在Symbolics工作,當時我們完全用Lisp制作了第一個“數字內容創建”(如Maya或AutoCAD)系統。 我1978年的碩士論文是關於一個基於Lisp的特定領域的程序動畫語言,稱為ASAS。 我們在Triple-I(信息國際公司)使用它來做早期的CGI工作,用於電影中的特效,包括1982年的TRON。 (這篇SIGGRAPH 論文對此進行了描述。)最后,游戲工作室Naughty Dog用一種名為Game Oriented Assembly Lisp(GOAL)的Scheme靈感語言編寫了幾個游戲(Crash Bandicoot,Jak和Daxter系列?)的游戲邏輯。

談到更現代化的努力,以及更嚴格的功能/不可變語言:“LambdaCube 3D是用於編程GPU(圖形處理單元)的類似Haskell的純功能域特定語言。”

在John Carmack在2013年Quakecon的主題演講中,他廣泛講述了(大約30分鍾)關於他對游戲開發的純功能語言的興趣和實驗。 他的觀點似乎是使用函數式編程有明顯的好處,但是存在一些挑戰,並且他在這條道路上沒有走得太遠以獲得強烈的意見。 他談到了試驗Haskell和Lisp。 本主題介於此視頻的 1:17:00-1:49:00之間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM