おもちゃバコ

主に趣味について

「ゲームプログラマになる前に覚えておきたい技術」を読んだ

こんにちはかいこうさく

この記事は「ゲームプログラマになる前に覚えておきたい技術」を読んだ感想と備忘録についてです.


Amazon


内容

キャラ制御,グラフィック,メモリ管理などゲームプログラムに必要な知識がまんべんなく解説されています.
内容は古いらしいですが,ゲームプログラムの基礎が網羅されているので学習にはおススメです.

対象

新人ゲームプログラマゲームプログラマを目指す学生など


要約

Part1. 2次元のゲーム

Chapter1 はじまりのゲーム

倉庫番を題材としたゲーム開発のイントロ
・変更する気のない変数はconstをつけよう.
グローバル変数は接頭辞として[g]をつけるなど,変数名に気を使う.
・列挙型を使えるときは使おう.
・newしたらdeleteする癖をつける.また,delete時にポインタを初期化する.
プログラマ以外にもわかるようにデータを作成する. ・C++の補足(namespace,template,const,2種のdeleteなど) ・プログラムが大きくなるほどconstなどの安全装置は有効に働く.
・const char x[] = "abc"とconst char* x = "abc"の違い.
・やろうと思えばポインタを使ってclassのprivateなメンバにアクセスできる(?).
・参照はポインタの危険な扱い方を防ぐ効用がある.
・ポインタ返しと参照返し

Chapter2 点から始める2Dグラフィックス

Visual StudioのDebug/Release設定は「すべての構成」を選択すると楽.
・newしたらdeleteを徹底しろ(RAII的な).

Chapter3 描いた絵を使う

・const_castを使用する場合は設計を疑おう.
C言語のキャストはなるべく使用しない(キャストはバグになりやすく,検索に引っかからないのは面倒なため).
・アライメントの問題に気を付ける.
・「人間は間違えることが可能な状況であれば必ず間違える」ことを念頭に置く.
・単純な高速化手法として,可能ならばループ中の計算をループ外で行う.
・中途半端に透ける-->アルファブレンド
・アルファブレンドは線形補完で実現可能.
・適切なインクルード
 実体:クラス「定義」
 ポインタ:クラス「宣言」
 1. インクルードガード
 2. (可能ならば)ポインタの変数を使用
 3. 必要とするヘッダをインクルード
・式変形の段階で高速化を意識する.
 アルファブレンド

Chapter4 リアルタイムなゲーム

・固定フレームレート
 遅いときに速くできない(一番遅い秒数に合わせる).
 再現性がある.
・可変フレームレート
 処理落ちがゲーム進行速度に影響を与えない(?).

Chapter5 かんたんなシーケンス遷移

・ASSERT
・「if-elseが10個並んだらそのコードを書いた人はヤバい」
 なんとなくわかる.
・階層型シーケンス遷移でゲーム画面を管理
 Stateパターンに近いものを感じる.

Chapter6 文字の書き方

・作成しているゲームが面白いかはすぐ判断できたほうが良い.
 素材は後でいいから速く実装する.
・シングルトン
 1. グローバル変数の危険を軽減する.
 2. グローバル変数を使用したい.
著作権
 大事.

Chapter7 はじめてのアクションゲーム

・ゲーム遷移
 状態遷移図であらかじめ図示しとくのが良いと思った.
・処理の共通化
 1人用と2人用で同じ機能(ポーズ画面など)を共通化すると楽.
  ただし,ポーズ機能が違うなどが発生すると面倒になるので,一長一短.
  柔軟性を持つことが大切.
・ゲーム開発は調整とテストの繰り返し.

Chapter8 平面の衝突判定

・あたる寸前で止める
 1. 何回かに分けて判定
  遅い.
 2. いつ当たるか計算
  すでにめり込んでいる状態が面倒.
 3. めり込んだら元に戻す.
・当たり判定を小さくする.
 Unityのコリジョンのイメージ.

Chapter9 いろいろな入力装置

・ライブラリの隠蔽
 ライブラリ開発者は使用用途を知ることができない.
  必要な機能はすべて準備.
  適切に隠蔽し,無用なバグや使用を防ぐ.

Chapter10 少しマシなシーケンス遷移

・ステートマシンでシーケンス遷移する方法(?)
・dynamic_cast
 ダウンキャストは遅い
・言語機能は無理してまで使用する必要はない.
 必要になったら使用する.
・継承についての補足
 仮想関数の詳細(実装寄り)
・継承の目的
 1. 派生を隠し継承だけを教える.
  中身は関係ない.
 2. 同じコードを何度も書く必要がない.
  比較的類推しやすい.
 3. 派生を使用する人が理解しやすい.
  基底側である程度実装すれば派生側は楽.

Chapter11 音を鳴らす

・音源ファイルの処理方法について.

Chapter12 回す,伸ばす,動かす

・回転
 補完しないと点が出現する.
 線形補完と2次元補完.
・拡大縮小
・アフィン変換
・ラスタライズ

Chapter13 ハードウェアのパワー

GPUは偉大
・ハードウェアは最強だが,自力で実装する力もあったほうが良い.

Part2. 3次元のゲーム

Chapter14 立体を描く

・Zソート
 z値の大きい順にソート.
・Zバッファ
・透視変換
・座標変換
・Zバッファ精度問題

Chapter15 ライブラリの作り方

XMLでデータ管理
・ライブラリは.libにまとめると良さそう.

Chapter16 XMLモドキを読む

・std::stringは遅い.
・文法の自由度を下げればデコード側は楽.
 そうだね.
・字句解析
 状態遷移図.
・最初は速度は気にしなくていい.
 慣れてきたら気にしよう.

Chapter17 遅くないコードを書くために

・計算量/オーダ
スループット
 単位時間当たりの処理能力
・レイテンシ
 結果を見るまでの待ち時間
・メモリの問題
・キャッシュ
・配置newとoperator new()
・std::set
 赤黒木
・「速度が必要とされる度合いに応じて適切なコードを書く」

Chapter18 立体の衝突処理

平方根
 割と扱いが面倒.
・三角形と線分の交差判定

Chapter19 ロボファイトの設計

・フロントエンド
 レーダ的な奴.

Chapter20 光が当たるということ

・レイトレース
・光源処理の高速化

Chapter21 キャラクターが動き出す

・モデルビュー射影行列
木構造による親子関係の実装
・ホーナー法
・Inverse Kinetics(逆動力学)

Part3. 売り物への道

Chapter22 遅くない衝突検出

・空間分割による衝突検出
・k-d tree
・CPU命令とキャッシュ

Chapter23 ローディング

・ファイル結合による高速化
・圧縮による高速化
・LZ77
・マルチスレッドによる非同期処理
・中身を見せないための結合と圧縮

Chapter24 floatの使い方

・数値が大きいほど次の数値までの幅が大きくなる.
・誤差
・ゼロの扱い
・無限大:Inf
・非数:NaN
・非正規数

Chapter25 付属ライブラリの本番仕様

・シングルトン
 Impl
・標準のrand()
・Thread
 Semaphore, Mutex, Event

Chapter26 バグとの付き合い方

・論理バグ
 作成しようとしたものが間違い,作成しようと思った物と違うものを作成する.
 「プログラムは書いた通りにしか動かない」
・技術バグ
 プログラム・ハード的に間違い.
 無知によるミス.
・処理落ち
 遅い.
・メモリ溢れ
 メモリ使用効率が悪い.
・コメント
 三日後は他人.
C++的にはアンダーバ始まりの変数はどうなのさ?
・試作品は捨てろ
 後々悲劇を生みやすい.
・メモリ解放忘れ
 crtdbg.h

Chapter27 もっと先へ

いろいろな参考文献が書いてある.

感想

C++や数学の知識が足りていないことを再認識できた本でした.

流し見で読みましたが,今度は項目別にじっくり読みたいと思います.