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

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

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

本日は,1月29日後半の「Adobe Max Japan 2009」レポートをお届けします。

AIR最適化テクニック:コード処理・メモリ・レンダリングを知る!

米EffectiveUI社 ソフトウェアデベロッパー ショーン・クリストマン氏のセッションは15:50から開演した。ショーン氏はAdobe Flash Platformに関わって8年になり,AIRに関わったのはαの時からだという。

写真1 米EffectiveUI社 ソフトウェアデベロッパー ショーン・クリストマン氏

写真1 米EffectiveUI社 ソフトウェアデベロッパー ショーン・クリストマン氏

Flash Playerの実行速度・イベントループ

ショーン氏によると,Flash Playerは委譲されたループによって稼働。通常は5~20ミリセカンドくらいのイベントループとなり,何度も繰り返されるという。そして,コードが実行される順番として大きく分けて,User Action・Invalidate Action・RenderActionの3つのカテゴリに分けられると示した。

写真2 コードが実行される順番は大きく3つのカテゴリに分けられる

写真2 コードが実行される順番は大きく3つのカテゴリに分けられる

始めに実行されるのがUser Actionである。User Actionはその名の通りデベロッパー自身が定義したコードであるが,その中でもMouseEvent.CLICKやEvent.ENTER_FRAMEなどに代表されるイベント処理が実行される。その後,レンダリングされる前の,レンダリングするために予約されているリザーブドコードが実行(Invalidate Action)され,最後にFlash Playerがその情報に従ってレンダリングをおこなう(RenderAction)。この作業の繰り返しが何度も起こることによってFlashは再生されているという。

そのイベントループは,フレームレートに基づいて決定され,ひとつひとつのフレームが生成される。そのフレームは2つのイベントから成り立っている。その一つであるEvent.ENTER_FRAMEがまず発行され,次にEvent.RENDERが発行される。このことから,ショーン氏はFlashは複数の情報がひとつのフレームに内包されている場合,負荷が非常に大きくなるため,情報(オブジェクトやコード)はフレームを分割していれていくべきだと指摘した。

また,Flash Player 10のPixelBenderを用いることで,本来Flashではサポートされていないスレッド処理を擬似的に行うことができるとし,PixelBenderのコードは別スレッドで行うためFlash Playerの描画を妨げず,長時間処理できると指摘した。

コードの最適化へのコツ

続いてショーン氏は,コード一つ一つや全体の最適化に対するコツを解説した。まず型指定である。ショーン氏によると,「何をさせるか,そのオブジェクトが何であるかをFlashの実行時,ランタイムに推測させずに済むため,実行がずっと早くなる」という。

var p:Point = new Point();
p.x = Number(1);
p.y = Number(2);

次にJIT(Just In Time compiler)を認識することも大切であると指摘した。コンパイラは汎用性のあるコードを自動的にネイティブコードに変換し,より効率的かつ高速に動作させるようにしている。これはコンパイラが自動で行うため,デベロッパーが特に意識する必要もないが,クラスコンストラクタのみはJITによって変換されないため,クラスコンストラクタのコードは比較的軽く,多くの定義はするべきではないとした。

ショーン氏はさらに,「オブジェクトには軽く処理できるもの,処理が重くなってしまうものがあるため,どのオブジェクトが一番扱いやすいかを理解することが大切である」と述べた。「たとえばint(整数のみが許諾された数値)は,Number(浮動小数点型を許諾する数値)よりも非常に処理が高いため,いわゆるプリミティブ型を積極的に使うべきであり,これは配列で多くのの計算処理を行う場合に非常に有効だ」と指摘した。

Flash 9以降,つまりActionScript 3.0の環境下では,ByteArrayを用いることも効果的だという。intやuint(符号付き整数値)をByteArrayに格納することで,非常に早く引き出すことが可能であるとのこと。

また,Vector(型指定付配列)にも言及し,「数字の扱いに対して非常に有効だ」とした上で,FlashPlayer 10の環境ではArrayよりも積極的にVectorを使用すべきであり,その恩恵を享受できるとし,ショーン氏は実際にArrayとVectorの実行スピードの違いとそのコードを披露し,その差は倍近くにもスピードアップすることを示した。

Flexで制作する場合には,DisplayObjectContainerなどで子を入れ子にしすぎない,多階層にしないことが重要だとし,「なるべく上流階層にオブジェクトが存在するようにすれば,レンダリング処理が上昇する」と述べた。

著者プロフィール

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

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

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

コメント

コメントの記入