はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング オブジェクトプールについて 理論編

あいさつ

どうも、はかせです。
今回は私がちょくちょく使うオブジェクトプールについて
説明してみようと思います。

オブジェクトプール

オブジェクトはまんまオブジェクトですね。
プールっていうのは貯める場所っていう意味があります。

つまりオブジェクトプールっていうのは
生成したオブジェクトを貯めておく場所です。

オブジェクトプールのメリット

オブジェクトプールのメリットは
オブジェクトの生成にかかるコストの抑制です。

私が主にやっているのがゲームプログラミングなので
ゲームプログラミングで話しますが、
ゲームっていうのはとてもたくさんのオブジェクトが存在します。

オブジェクトっていうのは極論言うとメモリです。
つまりオブジェクト生成=メモリ確保
オブジェクト破棄=メモリ解放といえます。

必要になったら生成して
不要になったら破棄して
また必要になったらまた生成してってやると
生成と破棄にかかるコストが結構かかります。

なのでこの生成と破棄を必要最低限におさえることで
処理コストを軽減しようっていうのがオブジェクトプールになります。

オブジェクトプールで生成したものをキープしておき、
必要になったらプールから取り出して使用、
不要になったらプールに返します。

こうすることでオブジェクトの生成は
プールした分が足りないときに補充する分だけで済みます。
使いまわしてつかうので破棄の頻度も減らすことが出来ます。

オブジェクトプールのデメリット

オブジェクトを使いまわすことで
生成と破棄のコストを抑えるオブジェクトプールですが、
裏を返せば常にメモリを保持し続けるというデメリットにもなります。

メモリを常に保持するってことは
メモリ不足になる可能性が高まるということです。
メモリが足りないと動作が重くなるばかりか最悪アプリがクラッシュします。

あと生成と破棄を行わないとはいえ
プールしているオブジェクトを管理しているわけで
オブジェクトプール自体の処理コストもそこそこあります。

オブジェクトプールの使いどころ

メリットとデメリットを書いてきたわけですが
じゃあいったいどこで使うのよと疑問になったかと思います。

基本的には
生成と破棄が高頻度で起こると想定されるもの
に使うといいとされています。

わかりやすいもので言うと弾幕シューティングの弾ですね。
弾幕シューティングの弾は秒間で数百発という数がでます。
これを打つタイミングで都度動的に生成して画面外に出たら
破棄なんてしていたらFPSが悲しいことになるばかりか
ゲームが応答停止しますw

なのでこういったものはプールしておいて使いまわすと
それだけで大分処理が軽くなります。

逆に秒間にせいぜい数十くらいしか生成しないなら
プールせずにそのままやったほうが結果よくなることがあります。

ただ結局この辺に明確なラインってなくて
作って動かしたものがパフォーマンスでなくて
ボトルネックになっているのが生成と破棄の頻度であるならば
オブジェクトプールを使うことで改善が見込めると思います。

あとがき

今回はオブジェクトプール理論編でした。

私は結構オブジェクトプール使うんですよね。
処理の軽量化っていうのももちろんあるんですけど、
オブジェクトの管理が1か所に集中するので
管理周りも楽になるんですよね。

それでは今回はこの辺でノシ