miyayouさんC/C++とデザインパターンについて語る

miyayouさんがゲームAIにおけるC/C++とデザインパターンの適用方法について語ってくれました。
8
三宅陽一郎MiyakeYouichiro @miyayou

まだ、C++の話題はOKですか?

2009-11-16 00:36:58
三宅陽一郎MiyakeYouichiro @miyayou

僕的には、Noel Llopis の C++ for game programmers http://bit.ly/4ae0cL をおぬぬめ。^^ この本が2003年に翻訳されていれば、いろいろな人がいろいろなところで困らなかった。良書。ちなみに、著者は、twitter やってる

2009-11-16 00:43:55
三宅陽一郎MiyakeYouichiro @miyayou

Noel Llopis http://gamesfromwithin.com/ 今は、iPhone 開発へ先進。このサイトは、iPhone 開発者必見。twitter もここから辿れる。

2009-11-16 00:46:15
三宅陽一郎MiyakeYouichiro @miyayou

お薦め2。James Nobel,Small Memory Software: Patterns for systems with limited memory 日本では、何故か「省メモリプログラミング」。副題にかろうじてパターンという言葉が。これはパターンの本なんですよ!^^

2009-11-16 00:51:54
三宅陽一郎MiyakeYouichiro @miyayou

お薦め3。Programming Game AI by Example 実例で学ぶゲームAIプログラミング,Composite Pattern,Command Pattern,State Pattern などパターン応用多し。2006年CEDECでAIにおけるデザインパターン解説

2009-11-16 00:58:05
三宅陽一郎MiyakeYouichiro @miyayou

C++の進化のおかげでAIのプログラミングは非常に楽になったし何よりクラスという概念の抽象性が効いている。さらに、パターンなどで抽象クラスの関係を定義して、実体は派生の実体で持たせる(ファクトリーパターン、コンポジットパターン…)ことで、高い抽象性の関係を表現できるようになった

2009-11-16 01:02:05
三宅陽一郎MiyakeYouichiro @miyayou

遡って1990~2000年は、ゲーム業界でC言語導入、標準化、使いこなしの時期だった。Cの地平のおかげで、Neural Netも、GAも比較的簡単に実装できるようになった。この時期に、Creatures とか、アストロノーカとか、GA,NNを応用したゲームが出現するようになった

2009-11-16 01:07:18
タカユキ@清原隆行 @nezumimusume

ゴール指向の実装例が載ってますね。使ったことあるのですが効果的に使えたとは言えませんでしたorz RT @miyayou: お薦め3。Programming Game AI by Example 実例で学ぶゲームAIプログラミング

2009-11-16 01:09:11
三宅陽一郎MiyakeYouichiro @miyayou

C++,オブジェクト指向で知能の構造化を抑えるという方向は非常に有効なはずだ。知能の構造化実装は、概念とクラスが対応するというより、あるクラス群のソサエティが一つの概念に相当するシステムになるだろう。そういった意味で、知能の層はパターンとして構造化される層の上に構成される。

2009-11-16 01:12:07
三宅陽一郎MiyakeYouichiro @miyayou

あるクラスのソサエティが一つの機能の上に実装すると、その下の派生されたクラスのインスタンス群によって、そのクラスのソサエティの多様性が発揮される。高い抽象性は派生とインスタンス化、さらにインスタンス同士の関係性によって、システムの動作が個性化されると同時に実現される。

2009-11-16 01:15:52
三宅陽一郎MiyakeYouichiro @miyayou

ゲームAIのOOな実装においてはそういったクラスの派生をスクリプトによって制御することで知性の多様的実装を実現する。思考のロジカルな実装をCが実現していたとすればOOのAIの実装はクラス階層の断面からインスタンスを実装することを通して知的機能を埋め込む。

2009-11-16 01:21:55
三宅陽一郎MiyakeYouichiro @miyayou

知性全体の動作は、クラスによって組まれた全体のシステム自身によって定義される。そこで組み込まれた派生クラスさらにそのインスタンスが、その全体のシステムに組み込まれる(食べられる)形でシステムは発展し巨大化し多様化する。OOにおけるAIの実装の理想系はそういったシステムだと思う。

2009-11-16 01:25:44
三宅陽一郎MiyakeYouichiro @miyayou

例えば「実例で学ぶゲームAIプログラミング」の第7章のUML図を見ると中央のコアシステムから外側へ向かって派生クラスが伸びそのインスタンスがくり返し実装されて行くことで全体の知性システムが実現される。さらにコンポジットパターンなど再帰的な階層化によってこの構造はさらに発展される

2009-11-16 01:29:46
三宅陽一郎MiyakeYouichiro @miyayou

つまり実装の仮定としては次のような手順を取るとよいと思われる。知能システムの動作自身は抽象度の高いレイヤーで実装する。これはデザインパターンの思想そのものだ。そしてそこからその知能システムをクラスの派生や、下層のレイヤーへの展開を通して大きく発展させ個性化し実装して行く。

2009-11-16 01:35:26
三宅陽一郎MiyakeYouichiro @miyayou

クラスの構造図としては同心円状、多層的(multi-layer)な構造としてAIの全体のシステムが実装される。そういったAIの多層的なシステムは未だゲーム毎に実装される場合が殆どだが AI Game Programming Wisdom シリーズに多くの実例を見出すことができる。

2009-11-16 01:40:58
三宅陽一郎MiyakeYouichiro @miyayou

つまりここにおいてもパターンの思想は生きている。知性のバークボーンのシステムは端的に言えば基本クラスの関係の中で定義されており、その基本システムに対してシステムそのものをインスタンス化する過程で知性の機能を実現する。こういったアプローチはオブジェクティブでこそ初めて実現される。

2009-11-16 01:45:32
三宅陽一郎MiyakeYouichiro @miyayou

こういった実装はゲームAIで重要な「スケーラビリティ」を実現する要となる。「スケーラビリティ」とは雑魚敵からボスキャラまで同じシステムの中で実装できる仕組みのことである。つまりゲームAIの実装のコツはクラスソサエティの拡張性とAIの拡張性の方向をうまく重ね合わせることなのである。

2009-11-16 01:51:58
三宅陽一郎MiyakeYouichiro @miyayou

ここにゲームAIプログラマが形成して積み上げて行く知識の形、能力が明確にされる。1つは「全体の知能システムをオブジェクト指向の高い抽象度を利用して実装する」手法。2つは「そのシステムを展開しインスタンス化する」方法。3つはそういった「実装の展開において実現される知的機能」の探求。

2009-11-16 01:59:06
下田賢佑 @kensukeShimoda

F.E.A.R.がそうでしたね。まああのゲームは敵の種類少ないですけど。 RT @miyayou こういった実装はゲームAIで重要な「スケーラビリティ」を実現する要となる。「スケーラビリティ」とは雑魚敵からボスキャラまで同じシステムの中で実装できる仕組みのことである。

2009-11-16 02:00:18
三宅陽一郎MiyakeYouichiro @miyayou

こういったプログラムの性質に慣れておくことがAIプログラマに大切なのは、実際のゲームAIの業務においては、先に実現されるべき機能が要求されるために、そういった要求に対して如何なる全体のシステム、そしてその展開が対応するかを十分に習熟しておかねばならないからである。

2009-11-16 02:02:22
三宅陽一郎MiyakeYouichiro @miyayou

例えばプランニングが必要になった場合、もし十分に必要な知識があればコンポジットパターン、コマンドパターン、ステートパタ…といった幾つかの必要なパターンが直ちに想起されUML図の簡単な雛形が思い浮かび何処にスクリプトを組み込めば拡張性と機能を実現できるかが見えていなければならない

2009-11-16 02:07:47
三宅陽一郎MiyakeYouichiro @miyayou

だが通常こういったAIプログラミングの性質を探求し身に着けるためには、プログラミング技術の上に多くの学習(と幾つかの経験)が必要とされる。決して何か難しいということではなくて、AIプログラム自身の性質に習熟するための時間と知能へのセンス(知的機能への嗅覚)が必要とされるのである。

2009-11-16 02:11:23
三宅陽一郎MiyakeYouichiro @miyayou

そういった意味で参考になる良書を先の3つの領域に分けて紹介しよう。①バックボーン②展開 ③機能。①②は実装よりの話であり、③はAIそのものの話である。

2009-11-16 02:17:32
三宅陽一郎MiyakeYouichiro @miyayou

①は「実例で学ぶゲームAIプログラミング」、Millington "Artificial Intelligence for Games"(非常に構造的、抽象的), AI Programing WIsom に散りばめられたパターンたちを集めるのがいいだろう。

2009-11-16 02:18:22
三宅陽一郎MiyakeYouichiro @miyayou

②は、プログラムの設計と、AIの機能を結ぶ実装の部分である。この部分においては、必ずしもゲームAIの本である必要はなく、C++などオブジェクト指向の実装の展開を学べる本であればよい。

2009-11-16 02:30:38