おもちゃバコ

中身スカスカ♡

「Game Programming Patterns ソフトウェア開発の問題解決メニュー」を読んだ

こんにちハードディスク

この記事は「Game Programming Patterns ソフトウェア開発の問題解決メニュー」を読んだ感想についてです.


Amazon


内容

ゲームプログラミングを題材としたデザインパターンについての解説書です.
対象はゲームプログラマですが,ソフトウェア開発に携わっている人にもおススメできる内容です.

対象

ゲームプログラマ,組み込みプログラマデザインパターンに興味のある人.
すでにデザインパターンを知っている人は少し簡単かもしれません.


要約

Part1. イントロダクション

ゲーム開発において,プロトタイプ開発時に殴り書きでコーディングすることがあるが,プロトタイプ完成後に使用する可能性も考慮して初めから綺麗にコーディングすることが大切.
・抽象化と分離は重要だが,プロジェクトが柔軟性を欲するまではこの工程に時間を割くべきではない.
・低レベルの最適化は最後に行うべき.(一般的に最適化は難読化しやすいため)
ゲームデザインの変更に素早く対応することは大事だが,後できれいにしましょう.
・不要なソースコードに時間をかけることはやめよう.

Part2. デザインパターン再訪

コマンド

要求をオブジェクトとしてカプセル化する.
・関節参照を利用し,実装はコマンドクラスにカプセル化する.
・「取り消し」と「再実行」の実装が簡単.
・コマンドキュー(コマンドストリーム)のようなものとして扱える.

フライウェイト

共有を利用して効率よくオブジェクトを処理する.
・省リソース化.

オブザーバ

オブジェクト状態が変化したときに他のオブジェクトに通知する.
・PSのトロフィーシステムのようなもの.
・ある状態が変化したという通知を受けるときに便利.

プロトタイプ

インスタンスからインスタンスを(プロトタイプとして)コピーして生成する.
・生成は面倒だがコピーが楽なときに便利.

シングルトン

単一のインスタンスを保証し,グローバルなアクセスポイントを提供.
・遅延初期化に注意.
・staticクラスでもいいかもね.

ステート

オブジェクト内部の状態変化に応じて振る舞いを変化させる.
・有限状態機械による管理.
・入口と出口処理で入退場処理を簡単に.
・階層型状態機会もいいよ.
・キャラクタの行動が内部状態によって変化するときに便利.

Part3. シーケンスのパターン

ダブルバッファ

逐次処理の複数作業を同時に処理したように振る舞う.
OpenGLDirectXにあるスワップチェーンのこと.
・状態が変更中であることを外部アクセスするコードにバレたくないときに有効.

ゲームループ

ゲーム内の時間進行をユーザの入力やプロセッサ速度から分離.
・ゲームループは開発者コードまたはプラットフォームのどちらにあるか気を付ける.
・フレームレート制御.
・電力消費の制限に気を付けること.

更新メソッド

フレーム更新のたびに一斉に1フレーム分のふるまいを実行する.
・UnityにあるUpdate().

Part4. ビヘイビアのパターン

バイトコード

ゲームのふるまいをバーチャルマシンの命令として記述する.
C++に組み込まれるluaみたいなもの.
VMを実作することが楽しい.

サブクラスサンドボックス

基底クラスを使用してサブクラス内に振る舞いを実装.
・派生クラスの多い基底クラスの結合度を最小化したいとき.
・サブクラス間で胸中する振る舞いを簡略化したいとき.

型オブジェクト

コンパイルなしに新しい型や既存の型を修正したいときに便利.

Part5. 分離のパターン

コンポーネント

複数のドメインを利用するクラスがあり,互いに分離したいときに便利.
・UnityのGameObjectで使用されている.
コンポーネント間の通信.

イベントキュー

メッセージイベント送信と受信処理を時間的に分離する.
・リングバッファ便利だよね.

サービスロケータ

サービス利用するコードに対して,結合なしにグローバルアクセスを提供する.
・NULLサービス.
・Singletonと似ている.

Part6. 最適化のパターン

データ局所化

CPUキャッシングを有効利用する.
・データ配置の工夫.
・ホット・コールド分離.

ダーティフラグ

結果が必要となるまで不要な処理を行わない.
・物理シミュレーションなどで有効.

オブジェクトプール

メモリ割り当て・解放を行うのでなく,再利用することで実行効率とメモリ使用効率を向上.
・オブジェクトの生成・破棄が頻繁に必要.
・BVHなどでも利用されている.


感想

クソコードを量産して怒られたのがキッカケで読み始めましたが,凄くためになる内容ばかりでした.
特にステートパターンの状態をクラスで管理するという考え方は,今までswitch文でバグを量産してきた自分には目から鱗と骨が零れ落ちました.

コマンド・シングルトン・ステート・バイトコードなど,自分で実装した内容に関しては理解できましたが,サービスロケータやサブクラスサンドボックスなど,実装したことがないものに関しては理解できていないので,プログラマとして成長した後に読み直したいと思います.