Posts RSS Comments RSS 32 投稿 and 1 コメント till now

Archive for the 'C/C++' Category

ゲームプログラマになる前に覚えておきたい技術

ゲームプログラマになる前に覚えておきたい技術

著者/訳者:Array

出版社:秀和システム( 2008-11-15 )

定価:¥ 4,725

単行本 ( 872 ページ )

ISBN-10 : 4798021180

ISBN-13 : 9784798021188


知りうる限りでは最良のプログラミングの教科書の1つ。

この本を紹介するのにうってつけの文章が本の中にある。

私がこの本を書こうと思ったのは、新人研修の教官をやった時に大変困ったからである。これを読んでおけ、と言える本がないのだ。この分野はこれ、あの分野はあれ、と列挙することはできるが、5冊も10冊も詰まれても新人が困ってしまうだろうし、そもそも部分の総和は全体にはならないのであって、プログラミングの本とCGの本をバラバラに読んでもゲームは作れないのである。

C言語やC++といった言語はいささか汎用的すぎて初めてプログラミングをやる人にはオススメできないと私は考えている。プログラミングが大好きという人ならprintf()で簡単な出力を出しているだけでも興味を覚えるかも知れないが、ほとんどの人にとってはC/C++の標準ライブラリの中でできることはシンプルすぎて面白みがない。そこで私が何かオススメの言語はないかと訊かれると、大抵はRubyやPythonのようなスクリプト言語でWebからデータを集めてくるとか、すぐにでも役に立つプログラムが書けそうな言語を答える。あるいはJavaのような最初から大規模なフレームワークが存在して、善し悪しはともかくオブジェクト指向のマナーを叩き込まれるような言語とか、ゲームが好きならゲーム向けの言語を勧める。その方が結果が見えやすく興味が持続しやすいと考えるからだ。

C/C++の問題点は標準ライブラリの中では初心者が喜びそうなことがしにくい。グラフィックは標準では扱うことができないし、ネットワークもPOSIXのSocketとかに頼らないといけない。クラスライブラリもSTLのようなコンテナくらいしかない。だから正統的なC/C++の本は無味乾燥になりがちだし、オブジェクト指向について書いても「Humanクラスを継承してMaleクラスとFemaleクラスを作ります。同じtalk()メソッドでもMaleとFemaleでは振る舞いが違い・・・」のような作っていて全然面白くない例に終始することになる。

本書のよいところはゲームプログラミングという目的を最初から定めていることである。ゲームは好き嫌いはあるにせよ、リアルタイムに入力を処理して出力するという規模の大きいシステムである。これによってプログラミングを学ぶ目的が明確化する。単に暗記事項だったものが「何のためにその機能を使うのか」という要請に基づく理解に変わる。このことは初学者にとってはとても大きいことである。

他に随所に著者の意見が書かれていてそれがまた面白い。プログラムを書くというのはきれい事ではなく、現実に色々と厄介な問題との戦いであり、上級者の率直な意見は実に貴重な教材になる。何のためにそうするのかという疑問について、きれい事で答えられるより、例えば「面倒臭いから」という意見の方が人間味があって理解しやすい。言葉の1つ1つが砕けた表現であることが多く共感しやすい。

値段はそこそこするが、この辞書のように分厚く充実した内容を考えれば決して高い本ではない。

Windowsプロフェッショナルゲームプログラミング2

Windowsプロフェッショナルゲームプログラミング2【CD-ROM付】 (Game developer books)

著者/訳者:Array

出版社:秀和システム( 2003-09-01 )

定価:¥ 2,940

単行本 ( 432 ページ )

ISBN-10 : 4798006033

ISBN-13 : 9784798006031


前著の方がよいかも。

やや技巧に走ってしまったような気がする。テンプレートで階乗だったか再帰的な計算を行うこととか、いきなりそういうことから始まる。これは別に難しいことではないのだけど、友人とどうかなあって話していたのを覚えている。他にもラムダ式などが出てくる。不確かな記憶だけれど、この本を執筆していた時期は、やねうらお氏は新しい言語を独自に作ろうということをしきりに書いていたような気がする。その影響を受けているのではないか。

タスクシステムあたりまでは前著で不足していた点であるのでよいと思うけれど、その後のマイクロスレッドはGame Programming Gemsあたりで一時期書いてあった内容を改良したもので、ちょっと突っ走りすぎかなと思うし、ビット演算の魔術あたりからはどうなのだろう?それ専門の本ならいいのだろうけど、ちょっとワープしているような感じを受けた。やねうらお氏はShort Codingあたりにも関わっていて、そういうプログラミングにも長けていることはわかるが、全体として本書がマニアックな印象になってしまった。

目次
第1章 C++プログラミングテクニック
第2章 タスクシステム
第3章 マイクロスレッド
第4章 マルチスレッドのデザインパターン
第5章 ビット演算の魔術
第6章 描画の周辺
第7章 プログラミングTips
第8章 開発環境をめぐる問題
第9章 フォローアップ

Windowsプロフェッショナルゲームプログラミング

Windowsプロフェッショナルゲームプログラミング

著者/訳者:Array

出版社:秀和システム( 2002-06 )

定価:¥ 2,940

単行本 ( 375 ページ )

ISBN-10 : 479800314X

ISBN-13 : 9784798003146


ゲームプログラミングのみならず、C++でプログラミングをする中級者にはお勧めの本。

ありきたりなタイトルであるため「やねうらお本」と言った方が分かりやすいかも知れない。やねうらお氏はゲームプログラマではネット上でよく聞く有名人で、はてなダイアリーのブログや「BM98′S ROOMつう」で面白い記事をたくさん見かける。一方で嫌いな人は大嫌いのようで、ネット上の書評も公平とは思えないものも結構ある。

プログラミングの入門書として気合いが入っているのか、最初のハンガリー記法のような心構えのようなところから始まるが、面白いのは次のC++プログラミングテクニックあたりからだと思うが、これも前置きが長く、たぶん本人でも使っていないようなnew / deleteのオーバーロード(多重定義)でメモリリークの検出あたりから入る。それから徐々にスマートポインタの解説に入り、最終的にはスマートポインタを全面的に使うという結論になっている。

前置きが長いのは悪いことでもなく、著者の思考の流れが分かる点では優れている。例えば学校の理科の授業でも小学校や中学校では天下り的に事実を教えられることが多い(最近は違うかも)が、科学史を学ぶとそれらも試行錯誤の結果たどり着いたものであることがわかる。同様にプログラミングでも没ネタがたくさんあって、最後に何らかのテクニックを得る。本書は全体としてそういう傾向にあると思う。色々思考を巡らして「葬る方向で」の一言で済ませてしまうのは、いらない記述のようだけれど、プログラミングの学習途中にある人にとってはよいのかも知れない。

また、オブジェクト指向プログラミングを取り入れていて、これも入門書にあるように単に覚えるだけではなく、なぜインターフェースクラスを作るのかとか、デザインパターンはなぜ考案されたのかとか、そういう基本的なことを実例を通じて理解できるため、これもまた初心者から中級者にはよい。そのかわり、網羅してあるのではなく、本書で必要な範囲しか書いていないので、初心者は他に入門書が必要になるだろう。

後半からは徐々にWindowsプログラミングの話になるが、Windowsでない環境の人も十分に楽しめると思う。特に描画に関するGTLのあたりはテンプレートの使い込みを学ぶ材料としてはよいものだと思う。スマートポインタもそうだけれど、テンプレートを遠慮なく使っているのも特徴か。

Modern C++ Designという本があったが、あのあたりからだろうか、テンプレートの使い方が研究され尽くしてきて、Boostライブラリのような「変態的」なものも多く出てきて、そこから入るとたぶん参ってしまう。もう少し簡単なものはないかと思うと本書はちょうどいいかも知れない。テンプレートについては続編でもうちょっと書いてある。

目次

序 章 ゲームプログラミングへの招待

  • 第1章 プログラミングのための準備
    • 1.1 documentation(ドキュメンテーションのあり方)
    • 1.2 coding style(コーディングスタイル)
    • 1.3 dubug(デバッグ技法)
    • 1.4 precompiled header(プリコンパイル済みヘッダ)
  • 第2章 C++ programming technique
    • 2.1 new/delete(newとdeleteについて)
    • 2.2 anti-memory leak(メモリリーク対策)
    • 2.3 faster new/delete(高速化されたnewとdelete)
    • 2.4 memory pool(メモリプール)
    • 2.5 garbage collector(ガベージコレクタ)
    • 2.6 auto_ptr(所有権つきポインタ)
    • 2.7 exception(例外処理)
    • 2.8 auto_array(所有権インディケータ付き配列ポインタ)
    • 2.9 smart_ptr(スマートポインタ)
    • 2.10 smart_vector_ptr(スマートポインタのvector)
    • 2.11 member function callback(メンバ関数コールバック)
    • 2.12 listner(リスナクラス)
    • 2.13 inner function(ローカル関数)
    • 2.14 smart_array(スマート配列)
    • 2.15 real smart pointer(本当にスマートなポインタ)
    • 2.16 interface class(インターフェース クラス)
    • 2.17 factory method(工場メソッド)
    • 2.18 parametrized factory(パラメータ化されたfactory)
    • 2.19 factory permutation(factory置換)
    • 2.20 singleton(クラス唯一のインスタンス)
    • 2.21 non-local static object(非ローカルなstaticオブジェクト)
    • 2.22 helper function(ヘルパ関数)
    • 2.23 versatile function callback(汎用関数コールバック)
    • 2.24 object deleter(オブジェクト解体子)
    • 2.25 chain of responsibility(責任の鎖)
    • 2.26 RTTI(実行時型判定)
    • 2.27 class export(クラスを外部から使えるようにする)
    • 2.28 proxy pattern & null device(proxyパターンとNullDeviceパターン)
    • 2.29 smart_iterator(スマートイテレータ)
    • 2.30 broadcast(chainを辿ってすべてのインスタンスに通知する)
    • 2.31 ref_creater(参照カウント付き生成子)
    • 2.32 functor(関数オブジェクト)
  • 第3章 ゲームに必須の汎用クラスの設計
    • 3.1 Timer(タイマ)
    • 3.2 FixTimer(固定タイマ)
    • 3.3 FPSTimer(FPSを安定させるタイマ機構)
    • 3.4 CriticalSection(クリティカルセクション)
    • 3.5 MutexSection(mutexによるセクション)
    • 3.6 Event(同期メカニズム イベント)
    • 3.7 Thread(スレッド)
    • 3.8 Application Initializer(アプリケーションの初期化子)
    • 3.9 ThreadLocal(スレッド固有)
    • 3.10 Single Application(同時複数起動しないアプリケーション)
    • 3.11 Window Message Dispatcher(Windowメッセージの配信)
    • 3.12 Window class(ウィンドウクラス)
    • 3.13 mouse cursor(マウスカーソル)
    • 3.14 Application Base(アプリケーション基底クラス)
    • 3.15 Debug Window(デバッグウィンドウ)
    • 3.16 Text Output Stream(テキスト出力ストリーム)
    • 3.17 Interval Timer(定期的にコールバックされるタイマ割り込み)
    • 3.18 Mouse Input(マウス入力)
    • 3.19 KeyBase(キー入力基底クラス)
    • 3.20 Virtual Key(仮想キー)
    • 3.21 Application Frame(アプリケーションフレーム)
    • 3.22 file wrapper(ファイル入出力)
    • 3.23 Serialize/Deserialize(シリアライズ・デシリアライズ)
    • 3.24 StringMap(文字列をキーとする連想記憶)
    • 3.25 cache(キャッシュ)
    • 3.26 Counter(カウンタ)
  • 第4章 DirectX programmingへの序奏
    • 4.1 about DirectX(DirectXについて)
    • 4.2 COM Initialize/Uninitialize(COMの初期化とシャットダウン)
    • 4.3 CoCreateInstance(CoCreateInstanceについて)
    • 4.4 DirectInput(DirectInputによるキー入力)
    • 4.5 JoyStick(ジョイスティック)
  • 第5章 サウンドクラスの設計
    • 5.1 CDDA(オーディオCDの再生)
    • 5.2 wave output(wavファイルの再生)
    • 5.3 DirectSoundBuffer(DirectSoundのサウンドバッファ)
    • 5.4 DirectSound(DirectSoundについて)
    • 5.5 Stream Sound(サウンドのStream再生)
    • 5.6 Audio Compression Manager(ACMによるサウンドの再生)
    • 5.7 Ogg Vorbis(Ogg Vorbisによるサウンドの再生)
    • 5.8 sound class on yaneSDK3rd(yaneSDK3rdにおけるサウンドクラスの設計)
    • 5.9 Sound Effect Manager(効果音のためのマネージャ)
    • 5.10 MIDIOutput(MIDIファイルの再生)
    • 5.11 MIDI Input(MIDI入力)
    • 5.12 AudioMixer(オーディオミキサ)
    • 5.13 VolumeFader(ボリュームのフェード)
  • 第6章 描画クラスの設計
    • 6.1 Surface(サーフェースについて)
    • 6.2 Screen Mode(画面モード)
    • 6.3 antialiasing(アンチエイリアス)
    • 6.4 alpha channel(αチャンネル)
    • 6.5 alpha surface(αサーフェース)
    • 6.6 DDB vs DIB(デバイス依存ビットマップ vs デバイス非依存ビットマップ)
    • 6.7 DIB(Device Independent Bitmap)(デバイス非依存ビットマップ)
    • 6.8 DirectDraw(DirectDrawによる描画)
    • 6.9 GTL(Graphic Template Library)(グラフィックテンプレートライブラリ)
    • 6.10 DirectDrawSurface(DirectDrawSurfaceについて)
    • 6.11 Dirty Rect(更新矩形)
    • 6.12 IME(日本語変換)
  • 第7章 ゲームプログラミングフレームワーク
    • 7.1 about scene(シーンクラスの設計について)
    • 7.2 scene stack(シーンの制御のためのスタック)
    • 7.3 scene control(シーン管理クラス)
    • 7.4 scene differentiation(シーンの微分化)
    • 7.5 scene serialize/deserialize(シーンのシリアライズとデシリアライズ)
  • 第8章 フォローアップ
    • 8.1 推薦図書
    • 8.2 参考(にすると良い)ホームページ
    • 8.3 CD-ROM収録内容