質問内容
こんにちは。
少し長くなりますが質問の方に目を通していただければ幸いです。
僕は現在2Dのアクションゲームを作っています。
そして魔法を実装するにあたってオブジェクトプールについて調べていたところ、疑問が湧いたので知恵をお借りさせていただこうと思い立った次第です。
今のところ、テスト用の火の玉を飛ばす魔法をAddressables.InstantiateAsyncとAddressables.Release、それからPrefabを使って実装しています
しかしインスタンス化とDestroy(僕はReleaseを使っていますが)はとても重いとのことなのでオブジェクトプールという手法について調べてみました。
ですがオブジェクトプールの解説での例はいずれも弾幕ゲームのように二十、三十と弾丸を撒き散らすようなゲームを想定しており、さらに下記のページのようにオブジェクトプールを行わない方が効率的な場合もあると言及しているサイトもありました。
そこで質問なのですが、オブジェクトプールはどのような場面で使うのかをどうか教えていただきたいです。
また、魔法に使うとしてオブジェクトプールを行うのは魔法装備後に装備してる魔法を検出して、その魔法のオブジェクトのみをプールするような運用でいいのでしょうか?
あらかじめすべての魔法のオブジェクトをプールすることはしない方がいいですか?
個人的に使えるのかなと思っている場面は
・敵キャラを配置、あるいは無限湧きの敵キャラのみ?
・魔法
・継続的にオブジェクトを吐くステージギミック
・ロードで復活する障害物
このくらいでしょうか。
しかしこうなると逆にプールしない方がいいオブジェクトが分かりません。
一度壊すと復活しない隠し通路に繋がる壁とかボスとかでしょうか?
一応下で今回はどちらがいいのかの検証をしてみますが、オブジェクトプールとはどのくらいの規模で最適となるのか諸先輩方のアドバイスをいただければ幸いです。
どうぞよろしくお願いいたします。
検証結果
オブジェクトプールはこちらのサイトのコードを使用して実装しました。
Akira_Kido_N様の 「Unityで簡単☆オブジェクトプール」
そしてこちらのメソッドはAddressables.InstantiateAsyncで生成したオブジェクトはプールできなかったのでInstantiateメソッドを使用したことを記しておきます。
また、プールの最大量は五個にしました。
実験の条件はプールする場合としない場合で断続的に五個ずつの火の玉を飛ばしてメモリの平均使用量と最高使用量を比較しました。
肝心の結果ですが、下記の画像のようにメモリの負荷はプールしない側が勝っていました。
平均的に見てメモリ使用量は20MBほどプールしてない方が軽いです。
よって今回の場合はプールしない方がよさそうですが、もしなにか間違えていたら教えてください。
それから、プールを使用する場面について何かアドバイスがあれば教えてください。
この手の検証にはまだ不慣れなので、なにか結果の提示に不備がありましたらそちらもご指摘くださいませ。
よろしくお願いいたします。
(また、本筋とは違いますし本当に図々しいのですが、一つ気になることがあります。
プロファイラのメモリ使用量の変動を見ていてたまにGCが起きていることに気が付きました。
何故ならメモリの線グラフが増えては減るジグザグになり、Monoの使用量が2MBほど増えて減るのを繰り返していたからです。
ゲームプログラミングなら最初に全てのメモリを確保しておくのが望ましいかと思われますが、このようなジグザグになるコードは修正した方がよいでしょうか?
一応LINQの削除やコレクションの使いまわしなどはできうる限りで行っています。
どうかこちらも気が向きましたらご教授くださいませ)
補足情報(FW/ツールのバージョンなど)
Unity 2019 3,7f1
追記
AddressablesでAddressables.InstantiateAsync().Resultで生成したオブジェクトを渡すことができるようです。
大変失礼しました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/29 08:35 編集