サイトトップ

Director Flash 書籍 業務内容 プロフィール

Flash OOP for ActionScript 3.0

第2章 ActionScript 2.0から3.0へのガイド
◎2-1 Flash Player 9とActionScript 3.0

●2-1-1 Flash Player 9の仮想マシンAVM(ActionScript Virtual Mchine)
ActionScript 3.0はFlash Player 9からサポートされます。その最適化された動作を実現するために新たに開発されたのが、仮想マシン「AVM2」(ActionScript Virtual Mchine 2)です。

ActionScriptはSWFにパブリッシュされて、Flash Player上で実行されます。ActionScriptをSWFに書出すことを、プログラミング上「コンパイル」(compile)と呼びます。ActionScriptは、コンパイルされると、Flash Playerが理解できる「バイトコード」という命令に変換されます。このバイトコードを解釈して実行するのが、「仮想マシン」なのです。

[MEMO]2-1-001 ランタイム
SWFがFlash Player上で実行されている状態をランタイム(run-time)といいます。

AVM2は、ActionScript 3.0のバイトコードを処理する、専用の仮想マシンとして新たに開発されました。したがって、ActionScript 2.0や1.0は、AVM2では動作しません。しかし、Flash Player 9には、従来のバージョンのバイトコードを処理するAVM1も、併せて搭載されています(図2-1-001)。また、Adobeは将来のFlash Playerについても、AVM1を引続きサポートすると表明しています。

▲図2-1-001■Flash Player 9とAVM
Flash Player and AVM
[編集者向け注釈] 森巧尚さんの画像を使っています。イラストを改めて起こしてください。
△ActionScript 3.0用のAVM2と併せて2.0/1.0用のAVM1も搭載されている。

ですから、過去のコンテンツが新しいFlash Playerで動かなくなるということはありません。また、ActionScript 2.0/1.0も、[パブリッシュ設定]で選択すれば、Flash CS3から書出すことは可能です。ただし、ActionScript 2.0/1.0に今後追加されていく機能は、あまり多くを期待できないかもしれません。

[CAUTION]2-1-001 ActionScript 3.0と2.0/1.0は混在できない
ActionScript 3.0と2.0をひとつのSWF内に混在させて使うことはできません。ActionScript 2.0と1.0は同じバイトコードを使うため、両バージョンのスクリプトを混在させることが可能でした(ただし、推奨はしません)。


●2-1-2 ActionScript 3.0の特徴
ActionScript 3.0の特徴を、いくつかご紹介します。ここでは、パフォーマンスとランタイム時のデバッグ、および言語体系について、簡単に触れておきます。

2-1-2-1 パフォーマンス
ActionScript 3.0は、パフォーマンスが大きく向上しました。最適化されたAVM2の処理により、その速度は従来の10倍に達することもあります。ただし、AVMはあくまでActionScriptの処理を行うということに注意が必要です。

アニメーションあるいはテキストの描画、サウンドの制御やサーバとのネットワークのやり取りなどは、Flash Plyer本体で扱います(前掲図2-1-001)。したがって、これらの処理はFlash Playerの細かな改善はあるにしても、ActionScript 3.0を使ったことで差が生じるものではありません。

実際上、アニメーション主体のムービーでは描画にCPUの負荷がかかるため、ActionScript 3.0により処理スピードが速まる場合はかぎられるでしょう。ポルシェで高速に乗っても、他の車で渋滞していたらスピードは上げられないからです。

[COLUMN]2-1-001 ActionScript 3.0でアニメーションの処理速度が向上する例
ActionScript 3.0でスクリプトによるアニメーションの処理が速くなる場合を、ふたつだけあげておきます。

第1は、描画負荷の小さいインスタンスを、大量にスクリプトで動かす場合です。フォーラムFLASH-japanで森巧尚氏が、5000個の点をランダムに移動させるサンプルを作成して、スピードの違いを紹介しています(<http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=5204&forum=20>)。動かすものを1ドットの点でなく、ボールにしたりグラデーションをかけたりすると、描画の負荷が上がって処理速度はたちまち落ちてしまうでしょう。

第2は、ひとつの動きが、他のインスタンスのアニメーションに干渉するような処理の場合です。複数のインスタンスが互いにゴムのようなもので結ばれて、その中のひとつを動かすと数珠つなぎに他のインスタンスも引っ張られるようなアニメーションが考えられます。たとえば、10個のインスタンスが互いに結ばれていると、ひとつの動きはインスタンス同士の総当たりの数(10×9)の処理を発生させます。したがって、数が増えると大量の処理が求められるからです。本書の共著者深津貴之氏のAMAZNODE(<http://amaznode.fladdict.net/about_ja.html>)がその例です。

パフォーマンスが向上したことで得られる最大のメリットは、比較的規模の大きなクラスやライブラリでも、処理速度が落ちなくなったことです。それにより開発者やチームの生産性が上げられるだけでなく、汎用的なライブラリやフレームワークが公開される動きも進むと考えられます。本書の第3章「ActionScript 3.0を使ったサンプル集」では、公開のライブラリやフレームワークを使った例も紹介されます。

○2-1-2-2 ランタイム時のデバッグ
ActionScript 3.0では、ランタイム(実行)時に型指定によるデバッグができるようになりました。

ActionScript 2.0では、データ型を指定するとコンパイル時にエラーがチェックされました。ActionScript 3.0でも、デフォルトではコンパイル時の型チェックは行われます。これを「静的な型指定」のチェックといいます。[パブリッシュ設定]の[ActionScript 3.0設定]で[Strictモード]のチェック(選択)を外すと、Standardモードとなり、コンパイル時の型チェックは行われなくなります(図2-1-002)。

▲図2-1-002■[ActionScript 3.0設定]の[Strictモード]

△[ファィル]→[パブリッシュ設定]の[Flash]タブで[ActionScript設定]ボタンをクリックすると[ActionScript 3.0設定]ダイアログが開く。

他方、ActionScript 3.0では2.0と異なり、型指定の情報がSWFに書出されます。そのため、Flash Player上でランタイム時に、型指定によるエラーが確認できるようになりました。これを「動的な型指定」によるチェックといいます。Flash Player上で実際に処理されているデータにもとづいて、細かなエラーが確認できます。[Strictモード]によるコンパイル時の型チェックも併せれば、より厳密なデバッグができるでしょう。

○2-1-2-3 言語体系
ActionScript 3.0の言語体系は、プログラミング言語としてスタンダードな体系に整理され、シンプルで統一化された仕様になりました。

第1に、仕様の統一化がはかられた例として、インスタンスの生成とイベントハンドリングがあります。インスタンスは、基本的にnew演算子で、コンストラクタを呼出して生成します。ActionScript 2.0のMovieClip.createEmptyMovieClip()とかMovieClip.attachMovie()のような特別なメソッドを使う必要がありません。MovieClipインスタンスは、new MovieClip()の呼出しで生成できます。

[MEMO]2-1-002 ActionScript 2.0から3.0への変更
[ヘルプ]の「ActionScript 3.0コンポーネントリファレンスガイド」には「ActionScript 2.0からの移行」という項目があり、ActionScript 2.0のプロパティやメソッドが3.0ではどのように変わったか、一覧表で掲載されています(図2-1-003)。そのMovieClipクラスの説明によれば、MovieClip.duplicateMovieClip()メソッドは、ActionScript 3.0には対応するメソッドがなくなりました。

▲図2-1-003■[ヘルプ]の「ActionScript 2.0からの移行」

△図は一覧表の一部を抜出したもの。MovieClip.duplicateMovieClip()メソッドは「削除」された。


[CAUTION]2-1-002[ヘルプ]の「ActionScript 2.0からの移行」の記載漏れ
[ヘルプ]の「ActionScript 2.0からの移行」には、「グローバルプロパティ」や「グローバル関数」、「演算子」、「ステートメント」などのクラスに属さない項目が、含まれていません。

Adobeのサイトに各製品のヘルプが公開されており、Flex 2のドキュメントの同名の項(<http://livedocs.adobe.com/flex/2_jp/langref/migration.html>)には、これらの不足している情報が掲載されています。

また、ActionScript 3.0は、イベントの扱いを後述(2-2「」)のイベントリスナーに統合しました。ActionScript 2.0/1.0の場合は、下表2-1-001のとおり、インスタンスに記述するイベントハンドラアクションとフレームに指定できるイベントハンドラメソッド、さらにはリスナーで登録すべきクラスがあったり、また同じリスナーでもコンポーネントではシンタックスが異なったりしました。

▲表2-1-001■ActionScript 2.0のクラスとイベントの処理方法
クラス イベントの処理方法
MovieClip、Buttonインスタンス on()またはonClipEvent()イベントハンドラアクション
MovieClip、Button、TextField、LoadVars、XMLなど イベントハンドラメソッド
Key、Mouse、MovieClipLoader、Stageなど addListener()で登録したリスナーオブジェクト
コンポーネント addEventListener()で登録したリスナーオブジェクト

ActionScript 3.0のイベントは、addEventListener()メソッドによりリスナー関数を登録して処理します(詳しくは、後述2-2「」参照)。クラスやイベントが異なっても、基本的な扱い方は同じです。ActionScript全体として、一貫した処理方法になりました。

[CAUTION]2-1-003 ActionScript 3.0はインスタンスには記述できない
ActionScript 3.0のスクリプトは、インスタンスに記述することはできません。Flashムービー内に書く場合には、すべてフレームアクションとする必要があります。

第2に、言語体系が整理された結果、クラスやプロパティ、メソッドなどに、細かな変更があります。まず、多くのクラスは「パッケージ」という、クラスを分類するパスに整理されました(ActionScript 2.0でも一部のクラスは、パッケージに属していました)。パッケージについては、クラスの定義と併せて後に解説します。

つぎに、プロパティおよびメソッドの名前や引数、戻り値の指定などが、細かく変わっています。プロパティについては、先頭のアンダースコア(「_」)はなくなり、名称が変更されたものもあります。ActionScript 3.0では、比率を表すプロパティも、基本的にパーセンテージ(%)でなく、100%を1とする小数値を返します。

ActionScript 2.0で先頭にアンダースコア(「_」)のついたプロパティが、3.0になってどのように変わったか、その一部を下表2-1-002に示します。

▲表2-1-002■ActionScript 2.0で先頭に「_」のついたプロパティの3.0への変更例
変更内容 ActionScript 2.0 ActionScript 3.0
「_」の削除 _root、_parent、_alpha、_rotation、_visible、_width、_height、_x、_y root、parent、alpha、rotation、visible、width、height、x、y
名称の変更 _xmouse、_ymouse、_xscale、_yscale mouseX、mouseY、scaleX、scaleY
値が%から小数値に _alpha、_xscale、_yscale alpha、scaleX、scaleY

[MEMO]2-1-003 rootプロパティは仕様も変わった
ActionScript 3.0のrootプロパティ(DisplayObjectクラス)の仕様は、2.0のつねにメインタイムラインを参照する_rootプロパティとは仕様が変わりました。詳しくは、[ヘルプ]のDisplayObject.rootプロパティの項あるいは筆者サイトの「DisplayObject.rootプロパティ」(<http://www.fumiononaka.com/TechNotes/Flash/FN0704001.html>)をご参照ください。

メソッドについては、たとえばgotoAndPlay()gotoAndStop()メソッドで、引数としてフレームの後にシーンが指定できるようになりました。そしてシーン名は、変数で渡すことが可能です(図2-1-004)。

▲図2-1-004■[ヘルプ]のMovieClip.gotoAndPlay()メソッドの項

△シーン名sceneは、オプション(省略可能)。文字列で指定する。

[MEMO]2-1-004 ActionScript 2.0のgotoAndPlay()とgotoAndStop()
ActionScript 2.0のMovieClip.gotoAndPlay()MovieClip.gotoAndStop()メソッドは、引数がひとつで、シーンは指定できませんでした。

けれども、他にグローバル関数としてのgotoAndPlay()gotoAndStop()があり、シーンとフレームのふたつの引数が渡せました。もっとも、これらは古い関数で、内部的にはコンパイル時に移動先フレームを特定してしまう仕様だったため、シーン名を変数で指定することはできませんでした。

大きな変更としては、インスタンスのステージへの表示やその重ね順を管理する「表示リスト」が新たに実装されました。これまでダイナミックにインスタンスを作成する際につきまとっていた深度が要らなくなります。また、イベントリスナーで扱われるイベントも、これまでとは仕様が変わっています。表示リストとイベントについては、節を改めて具体的なスクリプティングとともにご説明します(「」および「」)。

これまで述べたとおり、細かな点まで含めれば、ActionScript 2.0と3.0とではさまざまな違いがあります。したがって、すでに作成されたActionScript 2.0のスクリプトが、そのまま3.0でも動作するというケースはかなりかぎられると思われます。

しかし第3として、ActionScript 3.0も2.0と同じく、仕様はECMAScript 4に準拠します。つまり、ActionScript 2.0からの細かな変更はあり、初めはそれらを確認する手間がかかるとしても、基礎となる文法は変わらずひとつの仕様に則っています。

[MEMO]2-1-005 ECMAScript 4
ActionScriptは、ヨーロッパのコンピュータメーカーを中心に技術の国際標準を策定するECMAにより規定された、ECMA-262仕様に準拠します。ECMA-262は、一般にJavaScriptの国際標準とされています。したがって、基本的な文法は、JavaScriptと同一です。ECMA-262に準拠したスクリプトは、とくに欧米ではECMAScript(エクマスクリプト)と呼ばれます。

すでに確定した仕様はその第3版で、JavaScriptやJScript、それにActionScript 1.0がこれに準拠します。第4版のECMAScript 4は、まだ策定中です。

ですから、ActionScript 3.0の基本と大枠をまず理解すれば、その後の学習効率は大きく高めることができます。本章では、そのポイントを簡単にご紹介します。

●2-1-3 型指定によるパフォーマンスの最適化
AVM2はバイトコードを、ネイティブなマシンコードに変換します(この変換も「コンパイル」と呼ばれます)。そのため、処理もネイティブコードに匹敵するほど速くなるのです。その際に、変数(プロパティ)や関数(メソッド)への型指定が、きわめて重要な意味をもちます。

// 変数の型指定
var 変数名:データ型;

// 関数の型指定
function 関数名(引数:データ型):戻り値のデータ型 {
   ステートメント;
}

型指定をすると、AVM2がデータ型を認識できるため、コンパイルも最適化されます。すると、その値の参照だけでなく、データのプロパティやメソッドへのアクセスも高速になるのです。AMV2でパフォーマンスを最適化するには、つぎのふたつの条件を満たす必要があります。

  1. 変数(プロパティ)や関数(メソッド)に型指定する。
  2. プロパティやメソッドにはドット演算子(.)でアクセスする。

逆に、AVM2によるコンパイルの最適化は、つぎのいずれかの場合には働きません。

  1. 変数(プロパティ)や関数(メソッド)に型指定しない。
  2. プロパティやメソッドに配列アクセス演算子[]でアクセスする。

ActionScript 3.0でも、2.0と同じく、型指定をするかどうかは任意(オプション)です。しかし、ActionScript 2.0では、型指定がSWF書出し時のチェックのみで、SWF自体にはデータ型の情報は含まれませんでした。ところが、ActionScript 3.0は、データ型の指定がSWFに保持され、AVM2におけるバイトコードのコンパイルに活用されます。したがって、変数(プロパティ)や、関数(メソッド)の引数・戻り値には、必ず型指定することをお勧めします。

[MEMO]2-1-006 型指定による最適化
指定したデータ型によって、ActionScript 3.0から書出されるバイトコードも異なります。たとえば、数値のデータでも、int型で指定するかNumber型にするかによって、処理速度も変わってきます。

[Main/Next]


作成者: 野中文雄
更新日: 2008年1月19日[CAUTION]2-1-003を追加。図表の連番のつけ方を変更。
作成日: 2007年12月23日


Copyright © 2001-2007 Fumio Nonaka.  All rights reserved.