web-dev-qa-db-ja.com

関数型プログラミング言語はグラフィックプログラミングに適していますか?

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

38
castiel

関数型言語を使用して、他の言語と同じようにグラフィックスやゲームのプログラミングを行うことができます。

単純なゲームですが、ゲーム開発のための関数型プログラミングの練習として、Clojureで Ironclad:Steam Legions と書きました。

ゲームプログラミングにClojureを使用する上で私が学んだいくつかの教訓/一般的な観察は次のとおりです。

  • ゲームは非常に要求が厳しく、関数型言語はいくつかのオーバーヘッドを課すため、パフォーマンスに注意する必要があります。 Clojureは確かにほとんどのゲームで「十分」ですが、コードを最適化しておくための秘訣を知る必要があります。たとえば、関数型言語は、GCを多用し、多くの一時オブジェクトを生成する可能性があります。これを回避するためのトリックを学ぶ必要があります(たとえば、新しいシーケンスオブジェクトの作成を回避する方法でリデュースを使用するか、プリミティブアーティメティックを利用する)

  • Mutabilityはゲームで役立ちます。たとえば、物理演算やスムーズなアニメーションで何かをしている場合、多くの場合、常に位置が変化するオブジェクトがたくさんあります。あなたはこれを機能的/不変のデータ構造でシミュレートすることができますが、パフォーマンスを気にするならそれは良い考えではありません。したがって、たとえ慣用的ではなくても、関数型言語で可変デー​​タを取得する方法を見つけることは価値があります(たとえば、Clojureでは、おそらくJava配列を使用する必要があります)

  • 不変の永続的なデータ構造は、実際にゲームでも非常に役立つことがわかります。 Ironcladでは、ゲームの状態全体が単一の不変のデータ構造に格納されていました。これにより、ゲームの状態を効率的にスナップショット/瞬時に元に戻す/時間を遡って実行するなど、いくつかのクールなトリックが可能になりました。

  • Clojureはゲームスクリプティングに最適です。動的な性質と実行時のコンパイル、およびマクロを使用して任意のDSLを定義する機能を組み合わせることは、大きな勝利です。実際、私がOOP Javaのような言語でゲームを書いていたとしても、スクリプトにClojure(または別のLISP)を使用することを真剣に検討します。

  • Clojureはインタラクティブな開発に最適です。 REPLと一緒に実行中のコードをハッキングしているときに、1つのウィンドウでゲームを実行していることに気づきました。ゲームのデータ構造を変更してすぐに効果を確認するのは楽しいです! この素晴らしいビデオ は、Clojureスタイルの開発で何が可能かを味わうこともできます。

  • Clojureでは、少なくともグラフィックスにJavaライブラリを使用することがよくあります。 2DのSwingまたは3DのLWJGL。これらのラッパーが既に存在する場合もありますが、Clojureから直接使用するのは簡単です。結局のところ、Java interopは(.methodName object arg1 arg2)と同じくらい簡単です。

結論として、ハードウェアを直接制御するためにC/C++の方が優れている可能性が非常に高いパフォーマンス集約型のゲームを除いて、関数型言語はゲーム開発に完全に適していると思います。

80
mikera

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

19
Bill

おそらく、この5年前の質問については誰も気にしません。おそらく、元の質問者でさえもです。しかし、昔のGraphics-in-LISPの人として、私は量りたかったのです。タイトルは「グラフィックスプログラミング」について言及し、次にゲーム開発のためのライブラリーについて質問します。グラフィックプログラミングには、ゲームプログラミングとは無関係の多くのトピックが含まれていることに注意してください。 (たとえば、Clojureでデータを視覚化することは、「グラフィックプログラミングに適した関数型プログラミング言語」の例ですが、ゲームプログラミングではありません。)関数ベースの言語(LISPなど、すべてが関数である)にも違いがあります。副作用は許可されます)および不変のデータ型(HaskellやClojureなど)のみで機能する言語.

「マルチパラダイム」スタイルで書かれたLISPベースのグラフィックスシステムは確かにあります。つまり、純粋に機能的で不変ではありません。たとえば、1980年代初頭にSymbolicsで働いたとき、最初の「デジタルコンテンツ作成」システム(MayaやAutoCADなど)の1つを完全にLISPで作成しました。私の1978年の修士論文は、ASASと呼ばれる手続き型アニメーション用のLISPベースのドメイン固有言語に関するものでした。 triple-I(Information International Inc.)でこれを使用して、1982年のTRONを含む長編映画の特殊効果の非常に初期のCGI作業を行いました。 (これはこのSIGGRAPH paper で説明されています。)最後に、ゲームスタジオのNaughty Dogは、ゲーム指向アセンブリLISPと呼ばれるSchemeに触発された言語を使用して、いくつかのタイトル(クラッシュバンディクー、ジャク、ダクスターシリーズ?)のゲームロジックをプログラムしました。 (ゴール)。

より近代的な取り組み、より厳密に機能的/不変の言語について話す:「LambdaCube 3Dは、GPU(グラフィックスプロセッシングユニット)をプログラミングするためのHaskellのような純粋に機能的なドメイン固有の言語です。」

ジョンカーマックのQuakecon 2013での基調講演で、彼はゲーム開発のための純粋な関数型言語を使用した興味と実験について広範囲にわたって(約30分)話しました。彼の見解は、関数型プログラミングを使用することには明らかな利点があると思われますが、いくつかの課題があり、強力な意見を持つためにその道を十分に進んでいませんでした。彼はHaskellとLISPの両方の実験について語っています。このトピックは、この video の1:17:00-1:49:00の間です。

7
Craig Reynolds