さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

Why Lisp for Game Development?

自分のためにどうしてゲーム開発にLispを選んでいるのかというのをまとめておこうと思ったのでまとめてみます。

前提

自分の場合であるので、他のひとに聞くと全然違う意見が返ってくると思います。
前提としてゲーム開発向けであることにも注意してください。一般のプログラムの開発スタイルとは大分かけ離れてると思います。

自分がLispを選択した理由

自分の場合、Lispを選択した理由は「開発速度」 この一点のみです。他に利点は無いと言い切れると思います。多くのLisp推奨の理由をまとめているものでは、Lispの実行速度が速いとか色々あるかと思います。ですが自分の場合には開発速度だけです。

開発速度とは

自分の中で開発速度は「作り始めてプロトタイプレベルで良いので完成するまでの速度」と定義します。これは、ゲームの場合だとプロトタイプが出来さえすればあとはどうにでもなる事が多いからです。

ゲームだと要求ががらりと変わったりしないことが多いのが影響していると思います。例えばアクションゲームがRPGになるといった変更は起こりえないでしょう。

自分のゲーム開発のプロセス


自分の場合には、ゲーム開発は基本的に以下のステップで開発しています。

  1. ゲームの大枠を決める
  2. 最初のプロトタイプ作成
  3. ゲームのパラメータを試行錯誤する
  4. チューニングが必要であれば必要な部分だけ最適化する

自分はこのプロセスは、最初に全部会議とかで決めるウォーターフォールと何となく似ていると思っています。ただ、後半にまとめてバグ取りを行なうので後戻りしまくります。なぜなら「ゲームの大枠を決める」部分では仕様を固めることに注力します。しかし、設計にバグがあるかどうかなどの実装の方法について議論を行なうことはないです。このため設計の問題とか様々なバグが後から発見されます。

設計について

少し話しが逸れますが、しっかり詳細な設計とか考えるのも悪くないと思います。しかし、それではプログラムの実装開始が遅れてしまい他のメンバが作業できなくなってしまいます。プログラマのプログラム完成待ちなんていうのはもってのほかです。プログラマはコード打ってコンパイルしていればモチベーションを保つ事が出来ます。しかし、絵を描く人はどこに使われるか、実物ではどう動くのかさっぱり分からないけどアニメーションを描くという作業になってしまいます。これではモチベーションの維持は難しいです。音楽も同様ですね。これは良くありません。

言語に必要な要件

さて話を戻します。自分の中のゲーム開発プロセスに適合する言語としては、以下の要件が必要かと思っています。何となく重要だと思っているものから列挙します。

  • ファーストクラスに関数がある

これは地味に重要です。プロトタイプ作成を手早くやるためには、関数宣言とかプログラムの構造を考えるのに時間を割いていられません。ゲームは基本的に状態遷移マシンが一杯ある世界です。C/C++とかJavaでは、状態遷移マシンの更新関数を関数とかクラスにするのが定石ですがその為に色々構造を考えたりするよりも、とりあえず更新関数を直接渡してしまって動くものを作れるというのは強いです。

  • パラメータの変更/テストが簡単

これはSLIME使っている前提ですが、SLIME上でC-c C-cするとコンパイラが動いてコンパイルしてくれます。この結果は動作中のプログラムに即座に反映されます。こういった環境は他の言語では作れないです(あるなら教えて欲しい)。

Common Lispには仕様としてデバッガがあるので多機能です。先端のgdbと比較すると見劣りすると思いますが、自分に取っては十分です。あとGCがあるのでnullのチェックであるとかSYS_SEGVとお友達にならなくてすみます。

  • 最適化する余地が十分ある

RubyとかPythonとかと比較して速度をあげるためのオプションが一杯あります。なので「ロジック思いつかないけどとりあえずvectorにしてみた!」だけでも十分高速化できたりします。


こういう要件を満たす言語として自分はLispを選んでいます。マクロが欲しいとかももちろん使う理由としてはありますが、マクロに関しては代替手段というか無くても死なないし。

世界でLispをゲーム開発に選んでいる例はほとんど無い(中間言語Lispとかはあるみたいですが)ので、ノウハウをまとめておきたいですねぇ。