ホーム > 読んだ

Robert Nystrom
Game Programming Patterns
ソフトウェア開発の問題解決メニュー

ガイド

ゲームプログラミングでのパターンを適切に解説した良書

書誌

authorRobert Nystrom
editor武舎広之(監訳)、阿部和也・上西昌弘(訳)
publisherインプレス
year2015
price3800+tax
isbn978-4-8443-3890-1

目次

1本文
2抄録

履歴

editor唯野
2024.1.8読了
2024.1.10公開
2024.7.24修正

GoFのデザインパターンを下敷きにしつつ、ゲームプログラミングで特に一般的に使用されるパターンをC++でのサンプルでまとめた本。

評価が高いだけあって良書だと思う。具体的にはパターンに付随する検討項目がトレードオフも含めてしっかり書かれており、パターン自体もむやみに使えばいいわけではないこと(例えばシングルトンも結局はグローバル変数に伴う弊害がある)にも触れられておりバランスが良い。特に全体を通じてあくまで単純さにこだわる辺りなども非常にうなずけるものである。各章の長さも適切だと思う。

なお、目次に従って本書で紹介されているのものを強引に要約すると以下の通りである。

  • コマンド(メソッドをラップすることによる処理のストリーム化)
  • フライウェイト(数の多いオブジェクトから共通部分を抜き出すことで対象を減らす)
  • オブザーバ(通知を受け取ったオブジェクトへまとめて変化を伝える)
  • プロトタイプ(型の差分を抜き出すことで型の数を減らす)
  • シングルトン(インスタンスを1つに限定する、C++ならconstでも可)
  • ステート(入口処理や出口処理などFSMの状態に応じて振る舞いを変える)
  • ダブルバッファ(描画などでちらつきをなくす)
  • ゲームループ(全てのゲームが持つメインのループ処理)
  • 更新メソッド(各オブジェクトの更新をupdate()経由でまとめる)
  • バイトコード(ビヘイビアをスクリプト化してコンパイル対象から外し柔軟性を持たせる)
  • サブクラスサンドボックス(派生クラスを減らすために基底クラスになるべく機能を持たせる)
  • 型オブジェクト(1つのクラスが複数の型を示せるようにすることで継承による複雑化を防ぐ)
  • コンポーネント(クラスの巨大化を防ぐためにドメインを横断するものはコンポーネントで分ける)
  • イベントキュー(メッセージ送受信を時間的に分離する、特に音を重複させたくないサウンドなど)
  • サービスロケータ(サービス利用者にインスタンスを直接見せない)
  • データ局所化(データをポインタではなく配列にしてCPUキャッシュを有効利用する高速化)
  • ダーティフラグ(処理を遅延させるフラグで処理対象を減らす)
  • オブジェクトプール(オブジェクト生成・破棄を効率化するために再利用できる配列を事前に用意する)
  • 空間分割(対象空間を四分木などで分割することで処理対象オブジェクトを減らす高速化)

抄録

10-11

私が思うに、良いデザインとは、何かを変更したときにまるでプログラム全体がその変更を予想して作られていたかのように思えるデザインです。-/-

こう書くと聞こえは良いのですが、そのようなコードが自然にできるわけではありません。-/-

もう少し具体的に言いましょう。一番重要な点は、アーキテクチャとは変更を容易にするものだということです。コードには変更がつきものなのです。-/-

12

「分離」の定義はさまざまですが、2つのプログラムが「分離できていない(結合している)」というのは。一方を理解しないともう一方も理解できない状態だと私は考えています。-/-

私にとって、ソフトウェアアーキテクチャを考える主要な目的は、この「先に進む前に頭に入れておかなければならない知識を最小にすること」です。

もちろんその後のことも問題になります。「分離」は「一方のプログラムを変更してももう一方は変更する必要がない状態」とも定義できます。何らかの変更が必要な場合について考えているわけですが、分離が進んでいればいるほど、変更がゲーム全体に及ぼす影響は小さくなるということです。

13