「Adobe MAX Japan 2009」詳細レポート

1日目(その2)AIR最適化テクニック,Beyond the Knowledge~想像力が世界を変える FITC session,Technology Sneak Peek

この記事を読むのに必要な時間:およそ 5.5 分

メモリ管理

ショーン氏の話は,AIRにおいてのメモリ管理に移っていった。ショーン氏によると,⁠一つのウィンドウで,AIR実行時のメモリ使用量は少なくとも17MBはあるとし,そこからアプリケーションによって増えていくものだ」と述べた。そして,⁠DisplayObject一つあたり約4KBかかるため,ウィンドウやオブジェクトが多ければそれだけメモリ使用量が増えるていく」と指摘した。なお,SQLiteやWebKitを使用する場合には,使用する直前でロードすることを推奨した。これは,一度使用するとそれからメモリが下がらないためだと忠告した。

写真3 最初にすべてのデータをロードするのではなく,一つのデータがクリックされたときに,そのデータに付随するデータをロードしたほうがよい

写真3 初にすべてのデータをロードするのではなく,一つのデータがクリックされたときに,そのデータに付随するデータをロードしたほうがよい

メモリ使用量を調べるプロファイラーを使用する上での注意事項もあった。⁠プロファイラはFlash Playerそのものが使用しているメモリしかみせない」と指摘し,⁠そのAIRアプリケーションを表示するために使用しているOSのメモリは表示されず,レンダリング時にかかるメモリの使用量や,SQLiteを使用する際の使用量も表示されない」と述べた。

そして,Mac上でプロファイリングをする場合には,アクティビティモニターを,WINの場合にはプロセッシングエクスプローラー(タスクマネージャ)を使用するのを推奨。そうすることでアプリケーションが使用しているメモリの総数を見ることができ,その場合にはプライベートバイトの領域をみることが大切とした。

さらに,オブジェクトの再利用することも効果的であると解説。URLLoaderとDisplayObjectを例にあげ,複数回使用するときには一度使ったらどこかにプールしておき,再び使うときそこから引き出すほうが,新たに生成するよりもメモリの使用量がかからないとした。なお,メモリ使用量を削減する場合には,大型のシングルオブジェクトを使用することで,大量にある小型のオブジェクトよりもメモリの分断かを避けるための策だという。

ガベージコレクションについても言及。これに関してもFlashが自動的に呼び出すため,デベロッパーはとくに気にする必要はないとしながらも,マニュアルで呼び出したいのであれば,そうすることもできるとし,以下のコードを示した。

flash.system.System.gc();

注意点として,ガベージコレクションにはクリーンアップされないものもあり,以下のようなものは,FlashPlayerに自動的に登録されるため,手動で解除しなければFlashPlayerはオブジェクトとそのメモリをリリース(解放)しないという。

  • Timer
  • Loader
  • URLLoader
  • File/SQLite

そして,FlashPlayerがメモリを解放しても,OSがそれを受け取らない場合もあるとして,ガベージコレクションに頼るべきではないとし,改めてオブジェクトの再利用を強く推奨した。

レンダリング

ショーン氏は,レンダリングに関しても細かく言及した。

現状ほとんどのLCDのスクリーンはフレームレート60fps以上に対応していないため,それ以上にすることは意味が無く,プロセッサーの負荷を高めるだけだと警告。60fps以下にキープすることを奨めた。また,繰り返しの処理に対してはTimerではなくENTER_FRAMEのほうが負荷がかからないと指摘した。

次に,レンダリングには3つのエンジンに分かれていると述べた。それはLayout・Rasterization・Compositingであるという。また,ベクターのレンダリングにはFlash Professionalが最適であるとして,FlexやSilverLight,Javaよりも,ベクターに関しては処理能力が高いと指摘した。

そして,レンダリングの第一段階Layoutについて解説。レンダラーはまずDisplayObjectの空間座標・サイズを特定し,その時点で各オブジェクトがオフスクリーン(明示的又は暗黙的にステージに表示されない状態)であるか,オンスクリーンであるかを判断し,オフスクリーンであればこのフェースを迂回するとした。

第2段階のRasterizationでは,すべてのベクターをビットマップ要素に生成し,そしてスクリーンにアウトプットするが,このフェースもオフスクリーンであれば迂回され,アウトプットはされないとしている。このフェースではフォントやアンチエイリアスをすべてのエッジに施しているが,線種についてもストロークの場合には両端にアンチエイリアスが施されるため処理に負荷がかかると警告。できるだけ使用しない方がよい,とした。また,オフスクリーンにする手段として,visible=falseを推奨。alpha=0は見た目には見えないものの,実際には描画されているためCPUを無駄に使用するためだとした。

最終段階のCompositingでは,ショーン氏によると,この役割はすべての情報を入手して,最終的なイメージをアウトプットすることであるという。ここでビットマップは再利用のためにキャッシュされるとした。

レンダリングを行うときに重要なことは,ベクターを使うか,ビットマップを使うか判断することであるとショーン氏は語る。⁠両方メリットがあり,ベクターは拡大・縮小・回転が非常に綺麗で,可変だが処理が重い。ビットマップは拡大・縮小・回転が得意ではないが,ピクセルに情報をコピーするだけであり,何度も再利用することができる。最初こそメモリを食うが,最終的には長期的に少なくなる」として,実際にデモを通してこれらの違いを示した。

写真4 ビットマップを再利用したほうが,結果的にメモリ使用量が少なくなる

写真4 ビットマップを再利用したほうが,結果的にメモリ使用量が少なくなる

次にレンダリング時に関わるコードのコツを紹介した。まず,ショーン氏によれば,必要なDisplayObjectは事前に作っておくほうが,表示する直前に生成するよりも処理の加速が高まるとした。マスクについても言及。マスクは,下に置かれているオブジェクトもマスク自体も描画しなければならないため負荷が掛かってしまうとし,代わりにDisplayObject.scrollRectを使用することを推奨。scrollRectを使用することによってDisplayObjectの境界が判断され,それ以上は描画されず,マスクに比べずっと早いという。そして,Flashの背面透過についても解説した。Window TransparencyはWinでは10%ほどの負荷がかかるものの,Macでは負荷が一切掛からないとしている。

最後にショーン氏はWinとMacのWindowing architectureの違いについて解説。⁠Winではアプリケーションを開いて,クローズすればその処理は終了するが,Macでは起動後,クローズしたからといってアプリケーションそのものが終了するわけではないので,メモリの長期的な使用量を考慮する必要がある」と述べた。

セッションの最後に,今回のプレゼンテーションでは語りきれなかったテクニカルな情報をオンラインで掲載しているとして,ショーン氏自身のブログを紹介。また,AdobeTVのコンテンツにも今回と同様のテーマで情報を配信しているので,是非チェックして欲しい」と述べた。

著者プロフィール

加茂雄亮(かもゆうすけ)

株式会社ロクナナにて,ActionScriptを伴うFlashコンテンツや,AjaxコンテンツなどRIA開発に従事するフロントエンドエンジニア。テクニカルライターとしての一面を持ち,WEB・雑誌・書籍、媒体問わず執筆。また,イベントやセミナーでの講演など,精力的に活動している。

URLhttp://log.xingxx.com/
URLhttp://rokunana.com/