Game Programming Pattern 17のメモ
アジェンダ
- DirtyFlagとは?
- 例
- 利用場面
- 注意点
Dirty Flagとは
- Dirty Bit ともいう
- 対象データか見極めるための実装パターン
例
Q. 海賊船の位置管理問題
相対変換情報
- 位置変換処理の利便性で必要
- (船移動で見張り台移動)
絶対変換情報
- 各Objectの世界座標を決定する
- 画面描画する際に必要
位置表現の親子階層
舟 (p,r,s)
└─ 見張り台 (p,r,s)
└─ 船員 (p,r,s)
└─ オーム (p,r,s)
p: position(x,y,z)
r: rotation(x,y,z)
s: scale(x,y,z)
オームの絶対変換情報は?
- 親の相対変換情報から求められる
船(p,r,s) x 見張り台(p,r,s) x 船員(p,r,s) x オウム(p,r,s)
1frameで全て動く状況を考える
- 船移動 => 計算
- 見張り台移動 => 計算
- 船員移動 => 計算
- オウム移動 => 計算
絶対変換情報の更新対象
移動元 | 更新対象 |
---|---|
船 | 船,見張り台,船員,オウム |
見張り台 | 見張り台,船員,オウム |
船員 | 船員,オウム |
オウム | オウム |
無駄な計算
- オウム: +3回
- 船員: +2回
- 見張り台: +1回
解決策
- 計算を遅延する
- DirtyFlag (1bit) を各objectに割当
- DirtyFlag:True => 絶対変換が古い
- DirtyFlag:False => 絶対変換は最新
無駄のない計算
- DirtyFlagが立っている物体を親から順に計算
- 計算後にDirtyFlagを下げる
- 船,見張り台,船員,オウム移動
- 船計算
- 見張り台計算
- 船員計算
- オウム計算
利用場面
Angular
- サーバー送信必要か?をチェック
物理エンジン
- 物体が動いているかどうか?をチェック
GUIエディタ
- 一定時間ごとに編集済みか?をチェック
Unidux
- 状態が変わったかどうか?チェック
注意点
CPUコスト
- 計算遅延をしすぎると重くなるケースもある
メモリコスト
- メモリコスト >> CPUコスト の場合は利用しないほうがいい
DirtyFlag粒度
- 粒度でチェック時のオーバーヘッドが変わる
- 処理時間、送信量、bitサイズなど