Flash 3大Domainのお話 - ApplicationDomain編 -

Flashの3大Domain

  1. ApplicationDomain
  2. SecurityDomain
  3. crossdomain.xml

(crossdomainの下りは無理矢理)
ここらへんの単語はFlash開発していて良く聞くけど、あんまりきちんと解りやすい説明がない。
いや、ない訳じゃないんだけど、なんか解りづらい。
というわけで記事を書いてみる。

で、今回はApplicationDomainのお話。
解りにくい概要はここに書いてある。
(http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e07.html)

Loaderでswfファイルを読み込んださい、読み込み元swf、読み込まれたswf、相互に内部のMovieClipやクラスにアクセスできるのだが
ApplicationDomainを使うとそのアクセス関係を制御できるというお話。

つまり、A.swfがB.swfを読み込んだ際、A.swfからB.swf内部のクラスを使う事を許可、不許可の設定ができるのだ。(もちろん、その逆方向も可能)

そしてそのApplicationDomainの設定の仕方は全部で3通り

  • 新しいApplicationDomainを割り当てる (使用形態A)
  • 読み込み元と同じApplicationDomainを割り当てる(使用形態B)
  • 読み込み元の子としてApplicationDomainを割り当てる(使用形態C)

使用形態Aの場合

基本的にこの設定がデフォルト(だと思ってる)。
同じパッケージ名、同じ名称のクラスが読み込み元、読み込まれたswfに有った場合、同じApplicationDomainだと読み込まれた側のswf内部のクラスが上書きされてしまい、予想外の挙動をしてしまう。
例えば、読み込み元のA.swfにも、読み込まれたB.swfにもHogeという名称のクラスが有ったばあい、
B.swf内部にあるHogeクラスはA.swfのHogeクラスと同じものと見なされる。
一方新しいApplicationDomainを割り当てると
A.swf::Hoge
B.swf::Hoge
というクラスに内部的にはなる。なので、内部実装がよくわからないswfを読み込む場合とかに設定する。

使用形態Bの場合

前述したけど、読み込む際にApplicationDomain.currentDomainを指定すると
B.swf内部にあるHogeクラスはA.swfのHogeクラスと同じものと見なされる。
これは、特定のケース時のみHogeというクラスが必要になるけど、普段はいらない、というときに便利だ。
Loaderで必要なクラスを読み込んで使える様にする訳だから、普段はそのHogeのクラス分だけのswfバイナリサイズを小さくできる。
バイナリサイズが小さくできる、という事はユーザーがswfを表示させるまでの時間を短縮できるし、起動も速くなるという事でもある。
ただ、この方法使う際、swfを読み込む前にHogeクラスを参照してしまうとVerifyErrorが飛ぶので注意が必要。また、細かく分けすぎると、読み込む際のオーバーヘッドがでかくなりそのクラスを使用する際の処理が重くなってしまうのも注意(やり過ぎると、だけど)

使用形態Cの場合

2の場合も結構特殊だが、この場合はかなり特殊。
さっき書いたadobe様のリンク先によると

現在のドメインの新しい子ドメインを作成することにより、親のクラス定義を使用します。図では、"module3.swf" に対するアプリケーションドメインとして現在のドメインの子ドメインを設定しており、子ドメインでは、親ドメインに含まれるすべてのクラス定義を使用します。
この形態の用途としては、複数画面の RIA (高度なインターネットアプリケーション) を構成するモジュールをメインアプリケーションの子としてロードし、メインアプリケーションで定義されている型をモジュール内でも使用できるようにすることが考えられます。
クラスを更新される際に必ず後方互換性を維持するようにし、また、ロードされるモジュールよりもメインアプリケーションを常に新しくしておけば、メインアプリケーションに含まれるクラス定義はモジュール内でも使用されます。 また、このようにして新しいアプリケーションドメイン内にロードしたモジュールは、アンロードすれば、すべてのクラス定義をガベージコレクションの対象とすることができます (ただし、子 SWF への参照を確実に破棄する必要があります)。
このテクニックでは、ロードする側にあるシングルトンオブジェクトや静的クラスメンバーを、ロードされる側のモジュールでも共有できます。

とある。たぶん、この文章で一発で意味解る人は少ないと思う(僕は最初意味が分からなかった)。
簡単に言ってしまうとFlashでゲーム等のプラットフォームみたいなのを作る際に必要になる。

一般的に、プラットフォームを作る場合、プラットフォーム側がAPIクラスを用意してやり、アプリケーション側がそのAPIを使う。
このFlashの場合でいうと、読み込み元がプラットフォーム、読み込まれた側がアプリケーションとなる。
で、読み込み元と読み込まれた側のswfが違うApplicationDomainだとA、Bから読み込み元のAPIクラスが利用できない。かといって読み込み元と読み込まれたswfを単純に同じApplicationDomainにしてしまうと今度はAとBで同じ名称のクラスが有った場合コンフリクトを起こす。
f:id:crexist:20120222214333p:image:w400
上図の様に、読み込み元とはApplicationDomainは同じだけど、読み込まれたswf同士ではApplicationDomainを変えたい時にこの設定を利用する。
この設定ならば、子のApplicationDomainは親が用意したAPIクラスにアクセスできるが、子同士はアクセスできないので安心。

こんな感じで書いてみたけど、わかりやすかっただろうか。

マー気にせず、次はSecurityDomain周りのお話をします