2012-03-18 20 views
38

私自身の経験から、これについて非常に不思議なことに、すべてのグラフィックプログラミングはCまたはC++関連のようです。 Direct10Xのように。関数型プログラミング言語は、ビデオゲームを開発するためのグラフィックライブラリを提供していますか?機能プログラミング言語はグラフィックプログラミングに適していますか?

+0

http://www.haskell.org/haskellwiki/Research_papers/Functional_reactive_programming –

答えて

78

他の言語と同様に、機能的な言語を使ってグラフィック/ゲームプログラミングを行うことができます。

これは単なる単純なゲームですが、私はゲーム開発用の関数型プログラミングの練習としてClojureにIronclad: Steam Legionsを書きました。ゲームは非常に厳しいことができ、関数型言語は、いくつかのオーバーヘッドを課すそうであるようにあなたは、パフォーマンスについて注意する必要があり

  • は、ここで私が学んだいくつかの教訓/ゲームプログラミングのためのClojureを使用しての一般的な観察されています。 Clojureは確かに「ゲームには十分」ですが、コードを最適化するためにはこのトリックを知る必要があります。たとえば、関数型言語ではGCが多少重くなり、多くの一時的なオブジェクトが生成されます。あなたは

  • 可変性がゲームに有用である(プリミティブartithmeticを新しいシーケンスオブジェクトを作成、または活用することを回避する方法で削減使用して、例えば)これを避けるためにトリックを学ぶ必要があります。たとえば、物理学や滑らかなアニメーションで何かをしている場合は、絶えず変化する場所で多くのオブジェクトを持つことがよくあります。 で機能/不変のデータ構造でこれをシミュレートしますが、パフォーマンスを気にするならば、それは良い考えではありません。したがって、それは実際に判明

  • 不変の永続的なデータ構造(Clojureの中であなたはおそらくJava配列を利用することになるでしょうなど)、それは慣用でない場合でも、あなたの関数型言語に変更可能なデータを取得する方法を見つけ出す価値がありますゲームでも非常に便利です。 Ironcladでは、ゲームの状態全体が単一の不変のデータ構造に格納されていました。これにより、ゲームの状態/即時のアンドゥ/時間の逆戻りを効率的にスナップショットするようなクールなトリックが可能になりました。

  • Clojureは、ゲームスクリプトのために素晴らしい素晴らしいです。ランタイムコンパイルと組み合わせた動的な性質と、マクロを使って任意のDSLを定義する能力は大きな勝利です。実際、JavaのようなOOP言語でゲームを書いていたとしても、私はClojure(または別のLisp)をスクリプトに使うことを真剣に考えていました。

  • Clojureはのために素晴らしい素晴らしいです。 REPLの横にある実行コードをハックしながら、1つのウィンドウでゲームを実行していることがよくありました。ゲームのデータ構造を変更してすぐに効果を確認するのは楽しいことです! This awesome videoは、Clojureスタイルの開発で可能なことを味わうこともできます。

  • Clojureでは、少なくとものグラフィックス用のJavaライブラリを使用することがよくあります。 2Dの場合はスイング、3Dの場合はLWJGL。場合によっては、これらのラッパーがすでに存在していますが、Clojureから直接使用するのは簡単です。結局のところ、Javaの相互運用が結論として

(.methodName object arg1 arg2)と同じくらい簡単ですが、私は関数型言語は、あなたはまだとのより良い可能性が高い非常にパフォーマンス集約型のゲームを除いて、ゲーム開発のために完璧に良い選択だと思いますC/C++を使用して、ハードウェアをより直接的に制御します。

+0

は非常に多くのuに感謝のuに感謝、非常に興味をそそられます。 – castiel

+1

詳細で、 – Voo

+0

@Mikera、可能であれば、あなたが不変のデータ構造について話すときに、「時を経て後で実行する」という意味を詳しく説明できますか? – endbegin

19

これはトピックの良いシリーズです:(4部)Purely Functional Retrogames。 Clojureではこのアプローチを採用し、基盤となるJavaゲームライブラリを使用してグラフィックスを操作することができます。

+0

シリーズは、あなたの答えは本当に、本当に魅力的な映像は非常に思慮深く、 – castiel

3

おそらく誰もこれについて気にしないかもしれません。しかし、昔のグラフィックス・イン・リスプの男として、私は体重を増やしたいと思っていました。タイトルには「グラフィックス・プログラミング」と書かれています。グラフィックスプログラミングには、ゲームプログラミングとは無関係な多くのトピックが含まれていることに注目してください。 (例えば、Clojureでのデータ視覚化は、 "グラフィックプログラミングには適した関数型プログラミング言語"の例ですが、ゲームプログラミングではありません)。関数型言語(Lispのように、すべてが関数ですが、 (HaskellやClojureのような)不変のデータ型だけで機能する言語が含まれています。

「マルチパラダイム」スタイルで書かれたLispベースのグラフィックスシステムは確かにありました。つまり、純粋に機能的/不変ではありません。たとえば、1980年代初めにSymbolicsで働いていました。私たちがLispで最初の「デジタルコンテンツ作成」(MayaやAutoCADのような)システムの1つを作成した時です。 1978年の私の論文はASASと呼ばれる手続きアニメーションのためのLispベースのドメイン特有のものでした。 Triple-I(Information International Inc.)では、1982年のTRONを含む長編映画の特殊効果のために非常に早いCGI作業を行うためにこれを使用しました。最後に、ゲームスタジオいたずら犬は、Game Oriented Assembly Lisp(GOAL)と呼ばれるSchemeに似た言語でいくつかのタイトル(Crash Bandicoot、Jak、Daxterシリーズ?)のゲームロジックをプログラミングしました。ジョン・カーマックの基調講演で

で:

より近代的な努力、そしてより厳密機能/不変の言語について言えば、「LambdaCube 3DはGPU(グラフィックス・プロセッシング・ユニット)をプログラミングするためのHaskellのような純粋な機能ドメイン固有の言語です。」 Quakecon 2013では、彼はゲーム開発のための純粋に機能的な言語による彼の関心と実験について広範に(約30分)語った。彼の見解によれば、関数型プログラミングの使用には明らかな利点があるように思われますが、いくつかの課題があります。彼はHaskellとLispの両方を試してみることを話します。このトピックは、videoの1:17:00-1:49:00の間です。

関連する問題