【Unity】C#で学ぶFlyweightパターン!^o^【メモリ削減、リソース節約】【オブジェクト生成の効率化】

 

こんにちは!河条です!
今回はUnityとC#でFlyweightというプログラム設計について学びましょう!

※事前知識:C#の基本構文、オブジェクト指向の知識

Flyweightパターンって?🤔

余分なオブジェクトの生成を防止、効率化するのに使えます!

例えばモンスターの絵柄は全部同じなのに、10体生成した数だけ同じように絵を生成してたら処理は重いしメモリ使うしであまりよくないですよね!

このモンスターのモデルデータやテクスチャデータを共有しよう!というのがFlyweightパターンです!

ひとまずどれくらい節約されるか結果から🤔

用途としてはあまり適切ではないですが、スライムそのものを10体普通に生成するパターンとFlyweight設計で生成したパターンでメモリの使用量を見てみましょ(わかりやすさ重視で)
 

まずは10体普通に生成するメイン処理!

 
結果!

  
次はFlyWeight設計で10体生成したパターンのメイン処理!!

 
結果!


普通の生成だとメモリ20Kバイト使っているのに対してFlyweight設計だと8Kバイトですね!
1つのオブジェクトのメモリ使用量と、生成数によってはもっともっと大きな効果が出そうです!

 

上のメイン処理って結局裏で何やっているの🤔

最低限必要なのは以下の2つです!
スライムそのもののクラス
スライムを生成するFactory(工場)

実際のコードを見てみましょう!
ただメイン処理では使ってないですが、Factoryクラスの利便性も紹介するために、スライムだけでなくキングスライムやメタルスライムのクラスも作ります!

 

ここは特に説明いらないですかね🤔
それぞれのスライムのクラスを作ってインターフェースを用意させてます

 
肝は次のスライム工場です

 

解説フェイズ🤔


やっていることは単純に3つです
1、工場クラスで共有化させたいオブジェクト(今回だとスライム、メタルスライム、キングスライム)をDictionaryに登録
2、工場クラスで生成されたオブジェクトを呼び出し側に渡す
3、呼び出し側は工場クラスを介してオブジェクトを操作する


オブジェクトの共有化と聞いて難しそうな処理してそうな感じでしたが、案外クラスもロジックも少ないですね!
実際にFlyweightパターン使うなら冒頭で書いた通りスライムオブジェクトのグラフィック等のが適切ですが
(^o^)


Flyweightパターンは中規模以上のゲーム制作なら必ず必要な場面あると思います!ぜひ使ってみましょー!
^o^
ちなみに他にもObjectPoolというオブジェクトの生成、破棄のコストを下げる設計もあるのですが、これは長くなりそうなのでまた。。。