デザインパターン ダブルバッファリング

公開日:2016/11/12
更新日:2020/01/20

どうも。ゴン氏です。
デザインパターンとえば、GoFからだと思いますが、
今読んでたのが、ダブルバッファリングなので、
メモがてら考察します。
※ゴン氏の独断と偏見で書いているので、
間違っている可能性・一般的でない可能性があります。
【画面を表示するためのダブルバッファリング】
ダブルバッファリングパターンは
よく画面のチラつきを抑えるために表示処理で使われています。
バッファAとバッファBを用意し、
バッファAを更新している間は、バッファBを表示し、
バッファBを更新している間は、バッファAを表示する。
なぜこんなことをするのかというと、
バッファを更新する処理

画面を表示する処理は同期的ではないので、
バッファが一つだと、更新中のバッファが画面に表示されてしまう必要があるため、
ちらついてしまう。
(バッファと画面表示が密になってるからだと思いますが、詳しくはよく理解してません。)
仮に更新処理と表示処理が同期的に行えるとしても、更新処理と表示処理を並列で作業出来なくなり、パフォーマンスが落ちてしまう。
このような対応は描画処理だけでなく、他の問題に関しても有用な方法となりそうなので、
デザインパターンと認識すると有用そうです。
【解決すべき問題 When&Why】
ある状態が2つ以上から操作され、
片方の操作の途中の状態を、別の方の操作には渡したく場合に、
両方の処理を非同期で実装できるようにする。
なんか分かりにくいですが、
要するに、中途半端な状態は見せたくないけど、
待たせたくもない時って感じですね。
【解決の方法 How】
操作中と完成した状態の2つを保持しておき、
操作完了後に操作中と完成した状態を入れ替える。
常に別の操作には完成した状態を渡すようにする。
【オブジェクト化 What】
操作の状態と完成した状態を保持し、
入れ替え処理や状態の更新処理・状態を返す処理に関する振る舞いを持つ
オブジェクトを作成することで、
ダブルバッファリングに関する処理をカプセル化できる。
【どんな時に使えるかな。】
たとえば、複数人で、ターン制のゲームをやってる時に
誰でもいつでも参加可能な時、
各プレイヤーの行動をマスターデータに反映させている途中でも
直近のターンの状況を新規プレイヤーに返すことができる?
とかかなぁ。
きちんと使えば、協力プレイやイベントプレイで途中参加機能とかを
作りやすくなるのかな?
ちょっと強引すぎるけど。

最終更新日:2020年1月20日