【11】理論を軽視しないこと

大垣 真二

 ゲーム業界に入って最も気になったことは、物理定数や理論をいい加減に扱うプログラマが非常に多いということでした。多くの場合は、論文や書籍に記述されたアルゴリズムを実装する際に理解しないで結果だけを利用することに起因していると思います。時間の制約もありますから、これは一見仕方ないように思われますが、後々余計な手間を生み出すことになります。みなさんは、画像処理やレンダリングなどのプログラムを開発する際に、“論文の結果と色味は同じだが違う明るさになった”、また、“同じ結果を生むべき 2 つのアルゴリズムを実装したが結果が異なってしまった”、という経験をしたことはないでしょうか。私がグローバル・イルミネーションを学び始めた当初は、良くこの状況に陥りました。この状況になったとき、取りうる選択肢は二つです。一つは理解するまで勉強すること、もう一つは明るさなどの差を調整する適当な定数をコードの中に埋め込むことです。結果が出れば良いといった環境だと、後者も問題ないように思われますが、時間がないときであっても避けるべきだと思います。適当な定数を用いた場合のもっとも深刻な問題は、基準が不明瞭になるということです。したがって、後々別の等価なアルゴリズムとの比較ができなくなります。また、適当に埋め込んだ定数を開示した場合は、アーティストの無駄な作業を増やしてしまうことになります。こういった定数を持つプログラムをいくつか組み合わせて、一つの大きなプログラムを作ったとしましょう。同じ結果が得られるように複数のアーティストが定数を調整したとしても、人によってそれらの値はばらばらになり、自然なデータのやり取りが不可能となってしまいます。

 また、コーディング・ルールやデザイン・パターンについて、長い時間話し合う人が多いことも気になったことでした。これは几帳面な人ほどやってしまいがちなのかもしれません。話し合うこと自体は悪いことではありません。もちろんチームで作業する上では最低限の取り決めは必要だと思います。ただ、アルゴリズムや背景にある理論をしっかり理解していれば、自ずときれいで無駄のないコードになります。“見てくれ”ばかりを気にしていては本末転倒です。いま取り組んでいる技術の“核心”が何かを押さえておくことのほうが、ずっと価値のあることです。同じ時間をかけて話し合いをするのであれば、一番重要な部分をより良くするためになされるべきでしょう。同じようなことですが、これを作るのに最適な言語は何か、という質問もよく耳にします。何かを実装する前に私がよくやるのは、このアルゴリズムをもし GPU で走らせるにはどう書くだろうか、このスクリプト言語で書くときはどうするだろうか、マイコンではどうだろう、などと様々な状況を一度イメージすることです。こうすることで、異なる視点から問題を捉えることができ、最初に思い浮かべた方法とはまったく違う方法で、あるいは非常に効率のいい方法で実装できることがあります。しっかり理論を理解していれば、言語の仕様などたいていの問題はとるに足らないものだったと気づくことが多いでしょう。

 プログラムを書ける人はごまんといます。ゲーム業界は変化の速い業界の一つであると思います。無駄な仕事をしないためにも、長く働くためにも、もっと理論に重きを置いてみてはいかがでしょうか。