トップへ戻る

続くかも...

ゲームプログラマになる前に覚えておきたい技術 (2009/03/08)

Amazone で注文して1ヶ月ほどした2月19日に2009年2月20日発行の第1版第4刷 が届き、3月4日に全854ページを読み終えました。プログラム関係の書籍を一気に 読んだのは初めてかもしれません。 この本は興味がある部分を拾い読みするより、通読する(文庫本6冊分くらいの 文字数ですが)ほうが著者の平山氏の文体を楽しめます。「阿呆」とか「いい感じ」 とか「インチキ」とか著者の主観に基づいたような表現に「要求に応じて臨機応変 に対応するのがプロ」という主張が感じられます。

パズルゲーム、アクションゲーム、3Dアクションゲームを題材として、チームで ゲームを作成する場合に必要となってくる技術と考え方が 27 章にわたって読みやすい 文章で解説されています。サンプルプログラムはWindows上で動作するものの、OSや マシンのアーキテクチャに依存しない形で非常に基本的な事柄から「仕組み」を詳細に 解説してあります。3DCGに関する数学や照光処理、ソートと検索のアルゴリズム、 XMLの字句解析、衝突検出と応答、C++によるオブジェクト指向プログラミングなど 非常に広範囲の技術が網羅されています。単にゲーム作成を目的として読むには つらいかもしれません。 タイトルどおりに「プロのゲームプログラマになるために習得すべき技術」 の本です。カバーする範囲が広いためにこの本だけで済ますことは できませんが、これを読めば次に読むべき本は自ずとわかってくると思います。

サンプルプログラムも豊富で、自分でコンパイルする必要がありますが、 180本ほどの実行ファイルとライブラリについて、重複を無視すると 15万行以上のソースが含まれています。ソースコードは自由に使ってよいとの事で 非常にお買い得といえます。マイクロソフトのサイトから無料で入手できる VisualC++ 2008SP1 Express Edition をインストールすれば、環境変数を1つ 設定するだけで簡単にコンパイルできます。

本書では「絵描き」と「プログラマ」をはっきり区別し、きれいな画面は「絵描き」 の仕事、「プログラマ」の仕事はプログラミングという方針を貫いているため、 本文中に出てくるコードは地味な画面ばかりとなります。このレビューでは地味な 画面では寂しいため、付属のCD-ROMに入っている「絵描き」の協力を得た Nonfree の素材を使った最終版のサンプルのスクリーンショットを使っています。

第I部

最初はコマンドラインで動作するCUIの原始的なゲームです。Rogue のように文字だけでも 面白いゲームが作成できますが、ここではパズルゲームを題材に、初期化、ユーザ入力、 表示の更新という基本的なゲームの枠組みを順次作成していきます。C++についても簡単な 解説がありますが、名前空間、テンプレート、コンストラクタ、デストラクタと進んでいくため C や C++ に慣れていない人は本文中のサンプルコードを読むためには プログラミング言語C 第2版 でも手元に持っておいたほうがいいと思います。

右のスクリーンショットのようなきれいな画面とするには絵を表示する必要がありますが、 ゲームでは絵を移動したり、背景と重ね合わせたりする必要があります。絵を描く場合でも 基本はスクリーンの1ピクセルに色を指定することです。便利なライブラリも高機能の ビデオチップを使っても仕組みは同じです。点の集まりをコントロールして画面を描画する ライブラリの作成、画像データのフォーマットとファイルの読み込み、シーケンス遷移、 表示速度のコントロールといったテクニックを組み合わせて画像を使ったゲームを 完成させていきます。

7章から13章でリアルタイム処理を行う2次元のアクションゲームが題材 となっています。ゲームとするには必須の衝突に関して解説しています。

10章はシーケンス遷移とクラスの継承に関しての章で、まじめにオブジェクト指向言語を 使ったことがないと理解するのは大変ではないでしょうか。

12章は図形の拡大、回転、移動の数学的な基礎が焦点です。行列を使って図形の拡大、 回転、移動が自由にできるようになります。三角関数、行列などの数式が多く出てきますが、 ここを我慢して乗り越えることができれば、3次元で楽になります。

第II部

14章からの第II部は 3次元のゲームの解説です。3次元のゲームの作成といっても DirectX も OpenGL も解説されていませんが、陰面消去、Zバッファ、透視変換、 行列とベクタの3次元化、3次元の回転、ビュー変換といった3DCG の基礎が説明 されています。数式にめげずに理解すればWindows以外の環境でも応用が利きます。 また、XMLの構文解析、高速化、照光処理などの話題が扱われています。

15章の「ライブラリの作り方」はハードウェアの詳細を隠したライブラリの作成法の 解説です。ライブラリ自身は内部で DirectX9 を使っていますが、ライブラリを使う 側では DirestX の存在を意識する必要はありません。これは本書を通じて ウィンドウ を開くためにライブラリの内部で使用している Window32API が隠されていることと 同じです。興味があればソースを読めば最終的にWindowsのAPIを使う様子がわかります。

17章は主に高速化で考えるべき事柄としてアルゴリズムと計算量、スループットと レイテンシ、データ構造といった 3Dゲーム以外の分野でも知っておくべき内容と なっています。

20章は3DCGで重要な照光処理を、実世界の物の見え方をほぼ正確にモデル化している レイトレーシングという手法の解説から、それがどのように「インチキ」されて リアルタイムゲームで処理可能なランバートモデルになるのかの説明となっている。 簡単なランバートモデルから複雑で遅い方法に進む書籍がほとんどの中、一風変わった 内容になっています。

次の21章でやっと物体の階層構造が出てきます。木構造でキャラクターを階層化し、 動きを補間してアニメーションさせます。本文中では立方体に棒を4本挿した 単純なロボットを使っています。スクリーンショットにあるロボットは残念ながら 関節は動きません。

第III部

22章からのIII部「売り物への道」の内容は、衝突検出を速くするアルゴリズム の検討、データの読み込み時間を気にならないようにする方法の検討、浮動小数点数 の精度、メモリアクセス違反、メモリーリークなどのバグへの対処法などと なっています。本書で最も好きな部分は27章の冒頭の「何を学べばいいのか」です。 あえて内容は書きませんが、どんな業界、職種でも同じであると思います。

 

私自身は、 ゲームプログラマになる前に覚えておきたい技術 の目次を最初に見たとき、 知っているような内容が並んでいるように感じました。しかし、高校の教科書を 読み返して感じるように、実際に使ったり、人に説明したりできない知識が多いこと を思い知らされます。 この本の著者がこれだけ広範囲な話題を読みやすい文章で1冊の書籍にまとめたことに 驚きます。

この本の特徴は答えを示すのではなく、検討の過程から複数の選択肢を示して、 それぞれの方法を試し、長所と短所を示して、結果として採用した方法の妥協 した点を説明しています。普通のプログラムの解説では検討の過程と妥協した点は あまり書かれません。自分でも出来上がった物は公開しても失敗の過程は秘密です (例えば J3W)。 この部分が個人の経験となっていくと思いますが、この本を読んで実際に試してみると、 経験を速く蓄積できるかもしれません。

非常に分厚く、文字数も多く、CD-ROMにもソースコードが詰まっている書籍ですが、 広範囲な技術を扱っているため、この本だけで達人になることはできないと思います。 より詳しく知りたいと思った部分を他の書籍で補えばいいでしょう。この本を読めば、 次に読む本を選びやすくなるのは間違いありません。情報工学関連の学部や専門学校の 教科書として使ったらどうでしょう。ゲームはユーザインターフェースが非常に重要な プログラムです。ゲームプログラマを目指していない人にもお勧めできます。

copiright©Jun Mizutani 2009