Adobe のヘルプサイトに、Flash Platform 用コンテンツのパフォーマンス最適化のドキュメント (ベータ版) が公開されています。(Optimizing Performance for the Flash Platform) Flash Player 10.1 における変更点も詳しく説明されています。
もう直ぐ内容のより充実した正式なドキュメントが日本語版として公開されると思いますが、とりあえず概要だけでも紹介しておきたいと思います。
なお、このドキュメントかなり細かいです。通常のコンテンツではここまで気にしなくてもよいのでは、というくらい些細な違いも取り上げられています。今後、iPhone や Andoroid 携帯などリソースの限られたプラットフォームを扱う人は知ってた方がよいかもですが。
まず、メモリ管理関連のトピックからです。
Display Object
- 以下の 3 種類のクラスを目的に応じて使い分ける
- 特に Shape のインスタンスは MovieClip のインスタンスの半分程度のメモリ使用量
Shape: インタラクションの不要な場合
Sprite: インタラクションは必要だがタイムラインが不要な場合
MovieClip: インタラクション、タイムライン共に必要な場合
getSize() メソッド
- オブジェクトのメモリ使用量を調べることができる。単位はバイト
- flash.sampler.getSize(o:*):Number
- Flash Builder のプロファイラでも使用されている。flash.sampler パッケージを利用して独自のプロファイラ作成も可能
BitmapData の再利用
- 元の画像データが同じ Bitmap を複数作るときは BitmapData を共有する
- 下の例では、1 つの BitmapData インスタンスを 300 個の Bitmap が参照 - BitmapData を 300 個作る場合に比べ約 700KB の削減
var myImage:BitmapData = new BitmapData(20, 20, false, 0xFFCC00); myContainer:Bitmap; for (var i:int = 0; i < 300; i++) { // 同じ BitmapData のインスタンスを参照 myContainer = new Bitmap(myImage); addChild(myContainer); ... }
オブジェクトプーリング
- より積極的なオブジェクトの再利用、デザインパターンとしても有名
- 最初に適当な数のインスタンスを生成して使いまわすことで、オブジェクトの生成とガーベジコレクションの負荷を軽減
- 下のようなクラスを作成して利用
public final class SpritePool { // Sprite インスタンスを保持する Vector private static var pool:Vector.<Sprite>; public static function initialize( maxPoolSize:uint ):void { // 指定された数の Sprite を最初に生成 } public static function getSprite():Sprite { // プールから Sprite を取得 } public static function disposeSprite(disposedSprite:Sprite):void { // プールに Sprite を返す } }
このとき、Sprite のインスタンスが必要になった場合は、new を使わずに、上のクラスの機能を利用する
// Sprite インスタンスを取得 mySprite:Sprite = SpritePool.getSprite(); // Sprite インスタンスを返却 SpritePool.disposeSprite(mySprite); mySprite = null;
メモリ開放
- ActionScript 3 ではガーベジコレクターを呼び出せない (AIR の環境とデバッグプレーヤーでは可能)
- 参照に null を代入することでガーベジコレクターに回収可能であることを知らせる
- ガーベジコレクターは通常メモリ確保のタイミングで呼び出され、使用されていないオブジェクトを発見するとメモリを開放する
- 大きなアプリケーションではガーベジコレクションによる負荷で遅くなることもあるので、ガーベジコレクションの負荷を下げるためオブジェクトの再利用が有効
- イベントリスナーとして使われているオブジェクトは null を設定する前にイベントリスナーを削除する必要がある
- BitmapData.dispose() メソッドを呼んでから BitmapData への参照に null を設定することで BitmapData の使用するメモリを開放できる
- Flash Player 10.1 と AIR 1.5.2 から XML オブジェクトのメモリ開放用に System.disposeXML() メソッドが追加された
コメントする