税込429円この広告は、90日以上更新していないブログに表示しています。いうことで「オブジェクトプール」についてまとめておきます。"お手軽?"とかは、ただの主観なのでもっと使いやすいオブジェクトプールがあったら教えてください。オブジェクトプール?まず「オブジェクトプールって何?」ってやつです。オブジェクトプールは簡単に言えば「プログラムの実行中に作ると重たいから先にいっぱい作っておこう!」っていう仕組みです。ゲーム以外のプログラムでも使われているものなので割といろんな人になじみ深いものなのかもしれないです。聞いたところによると有名なHTTPサーバである「Apache」の内部でも使われているみたいです。気になるオブジェクトプールの効能ですが、とりあえず下の図を見てください。それぞれ1000個のGameObjectを生成した結果をProfilerで確認したものです。ms」の項目で普通にInstantiateした場合はInstantiateとActivate合わせて大体61.21msオブジェクトプールの方がActivateのみなので大体8.75msなんとオブジェクトプールを使うと速度が約7倍早くなってます!驚異的ですねぇ~しかしオブジェクトプールは速度と引き換えにバグを抱えやすくなる要因でもあるので、きちんと管理していかなければなりません。デザインパターンなの?サブタイトルにデザインパターンとか書いてあるのは下の書籍でパターンとして紹介されていたからです。この本はかなりおすすめです。多摩センターの丸善に一冊しか置かれてないのが不思議なぐらいです。作者の語り口やユーモアがいたるところに散りばめてあるので読むだけでもかなり面白いです。あと裏表紙の著者とわんこが面白いです。手遅れだけど、3年ぐらい前のプログラミング覚えたての時に欲しかったです。(いやほんとに...前書きが長くなりましたが、次からオブジェクトプールを作っていきます。作ると言っていたのは嘘だったようです。仕様を確認しましょう。管理はGameObjectのActiveのオンオフで使わなくなったときはActiveをオフにするだけ生成したオブジェクトは子にしてActiveがオフの状態にしてお足りなくなったときは追加できるようにするジェネリックで作っておいて用途に応じて継承するとりあえずこんな感じです。1と2はUnityで既にGameObjectという仕組みができてるのでそれをそのまんま使います。2は重要で元々の機能を使うことでオブジェクトプール用の基底クラスを作ったりしなくてよくなるのでお手軽さを上げてます。ほんとに作っていきます。//クラスの中身}仕様の5番で基底はジェネリックにしとくようにしたのでこんな感じ。一応whereで制限を掛けときます。//初期化フラグそれぞれコメントに書いてある通りですね。temp;}一応追加と初期の生成も兼ねてるので、プールがなかったら作って、プールがある場合は移し替えてます。ftvlog)を見かけたので、配列はなるべくforeachを使うようにしてます。objs;}それぞれ毎回取得O(n)の計算量が掛かってしまっているのが若干痛いところですね。O(1)にするためには「取り出し」と「しまい」があれば大丈夫なのですが今回オブジェクトプールが管理するのは「取り出し」だけなのでこんな感じになってます。どちらとも管理しなくてもO(1)にする方法があったような気がするんだけど、忘れてしまったのでそれはまた思い出してからで。実装はこんな感じです。次は継承先を作ります。使われるであろうTransform用のオブジェクトプールです。}}一旦継承させておくことでそのクラスにあった取り出したときの初期化が出来るようになります。月別アーカイブはてなブログをはじめよう!seiroiseさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。