Flasherのためのデザインパターン-FlyWeightパターン
デザインパターンをはじめて読んだのは、結城浩さんの「Java言語で学ぶデザインパターン入門」でした。
読んだ当時もっとも有用性がわからなかったのですが、最近になって重要さが身にしみてきたパターンが「FlyWeightパターン」です。
Flasherにイメージしやすいように簡単に言うと、たとえば同じ外部画像ファイルなどを何回も表示するときに、一個のBitmapDataをどこかに保持しておいて、使いまわすといったようなつくりのことです。
AS3以降、BitmapおよびBitmapDataクラスをよく使うことが増えましたが、Bitmapの中身のBitmapDataは使いまわせるのはご存知でしょうか?
いわゆるビットマップ操作を行う場合はコピーして使うと思いますが、フォトビューワーやスキンなどそのまま表示するための画像であれば、複数のBitmapで単一のBitmapDataを利用することができます。
// 元になるグラフィック var original :BitmapData = new BitmapData( 100, 100, false, 0xFF0000 ); // それぞれ別々のコンテナにアタッチ var obj1 :Bitmap = new Bitmap( original ); var obj2 :Bitmap = new Bitmap( original ); var obj3 :Bitmap = new Bitmap( original ); obj1.x = 10; obj1.y = 20; obj2.x = 150; obj2.y = 20; obj2.scaleX = obj2.scaleY = 2: obj3.smoothing = true; obj3.alpha = 0.5; addChild(obj1); addChild(obj2); addChild(obj2);
こうすることでメモリ的に(外部ファイルの場合は通信的にも)やさしいかんじのつくりにすることができます。
具体的にはRPGのマップデータのように同じ画像をたくさん使ったり切り替えたりするときに有用化と思います。Bitmap.bitmapDataは代入しなおすことで内容のみを切り替えることもできるのでアクションゲームのように頻繁にグラフィックが切り替わるものでも役に立つ場面がありそうです。
参考程度にWonderflで同じBitmapDataで大量に敷き詰めるサンプルを作りました。クリックすると再度画像を敷き詰めなおしますが、メモリ量はそれほど変化しません。右クリックのメニューでSWFProfilerを表示できます。
(※Bitmapは新たに生成しているので一時的に微増しますが、時期に破棄されていきます)