Debug 版 Flash Player の罠
2009/11/11 22:36 - AS3.0
私は現在、 FlashDevelop 3.0.5 と Flex 3.4 を使って ActionScript プログラムを楽しんでいます。
FlashDevelop の Tool > Program settings > FlashViewer で External 選択、かつ、Player のパスが空という設定で、使っていました。 このとき Flash Player 10 としてコンパイルすると \<flex_sdk のフォルダ>\runtimes\player\10\win\FlashPlayer.exe が起動するんですよね?
で、その player って Debug 版ですよね? この Debug 版とそうでない版の player(ブラウザ用でもスタンドアロンでも)とでは、その挙動に大きな違いがあるようですよ?
以下は Flash Player 10 用の ActionScript 3.0 でプログラミングしていたときに危うく嵌りそうになった Debug 版 Flash Player の罠の話。もうちょっとでガセエントリーをアップしちゃうところでしたよ、全くもう!
Java でのオブジェクト指向プログラミングの本を読んでいると、カプセル化絡みで private と public の扱いについての話が出てきます。
「クラスの独立性や堅牢性を高める、あるいは、クラス同士の疎結合を維持するにはメンバプロパティは private で定義し、アクセサーを使って外部からアクセスするようにすべきである」というアレです。
ActionScript でいえば、メンバプロパティは private で定義し、それらへのアクセスは setter や getter でおこなう、ということになります。
私は、可能な限り規約に基づいた記述を心がけたいと考えており、となると、private で定義して getter/setter を使う記述(以下(1)と呼称)を選択することになります(以下、public で定義する場合を(2)と呼称します)。
ところで「Javaの格言 ―より良いオブジェクト設計のためのパターンと定石」という本の P4 には、(2)の方が(1)よりも早い、という意味のことが書いてあります(もっとも直後の P7 で(1)の記述を採用しながらも(2)並みのパフォーマンスを出すテクニックも記述してありますが)。
また、wonderfl 上で発生した「パーティクル祭り」でのコードを拝見すると全てが(2)での記述になっていたようです。
言うまでもないことですが、コンパイラの仕様によって異なるので、「Java の格言」の内容がそのまま ActionScript に当てはまるとは思いません。
でも実際のとこ、現状の ActionScript 3.0 のコンパイラでは(1)と(2)では速度面で有意差がみられるのかどうなのか、というのが気になりました。
特に有意差がないなら、(1)の方で書いていきたいなぁ、と、いろいろ試していたんです。
最終的な結論から言うと、どっちでも大して変わらない、と考えて良さそうです。 なので、私としては原理原則に則って、(1)の書き方をしていこうと考える所存ですが、その結論に辿りつく前に、思わぬ障害物として Debug 版 Flash Player が立ちはだかった、というのが今回の話。
「ドット地球儀」のコードを弄くり回していたんです。このプログラムではドット1個に対して Vertex インスタンス1個を割り当てています。 この Vertex クラスのプロパティである XYZ 座標を private で書いた場合と public で書いた場合を比較してみました。
当初、冒頭で示した状態で FlashDevelop を使っていたら、(1)と(2)では、かなり大きな有意差が見られました。もちろん(2)つまり public の方が速かったんです。
そっかー、じゃあ超大量にパーティクルを作るような場合は規約無視すべきなのかぁ、と思いながら SWF ファイルをネットワーク上にアップロードしてブラウザで確認したところ、なぜか有意差が消えました(確認したブラウザは IE 8 と Firefox 3.5.5。Flash Player はどちらも 10.0.32.18)。
ネットワーク上では有意差が無く、ローカル上では有意差がある。これは一体どうしたことだ、といろいろ試してみました。
その紆余曲折は冗長かつ煩雑なので省きますが、スタンドアロン版の Flash Player をダウンロードして、Debug 版でないものに対して、FlashDevelop の Tool > Program settings > FlashViewer でパスを通したところ、(1)と(2)の有意差が消えました。
つまり FlashDevelop の F5 キーを押したとき、デフォルトで呼び出される Flash player が、この不審な挙動を引き起こした原因になっていたと判断せざるを得ない。
Flex に標準で付いている player は Debug 版なわけですが、これって何か特別な理由があってそうなっているんですかね?
もし理由がないのなら、Debug 版でないスタンドアロン player が付いていて欲しいものである、そんなことを感じた昼下がりでした。