ポリモーフィズム(多態性)

ActionScript // 2009年05月02日 - 11:34

ポリモーフィズムってすばらしい。サブクラスはスーパークラスとして型宣言できるだけでなく、JavaやActionScriptにおいては、インターフェイスを使うことでその実装クラスがインターフェイスの型として宣言できるところがなんともすばらしい。「スーパークラスとして」というのは、要はMovieClipはSpriteの継承だからSprite型としても宣言できまっせという当たり前といえば当たり前な話なんだけど、すばらしいのはインターフェイス。

»続きを読む

Eventdispatcher#dispatchEvent()で独自のイベントを送出する

ActionScript // 2009年03月23日 - 23:15

イベントを送出するのに使うdispatchEventメソッド。引数にはEventオブジェクトを指定するんだけども、実はEventオブジェクトの定数を使わないでも任意の文字列を指定することで独自のイベントを送出できる。

イベントを発生させたいタイミングで
dispatchEvent( new Event("hoge") );
ってやれば、あらかじめ登録した任意文字列のリスナーでフックできる。
addEventListener("hoge", trace);
など。

セッション管理

ActionScript // 2009年03月16日 - 21:31

rootに変数作ってどこからでもアクセス可能なグローバル変数的なことやるのはなんか気持ち悪いと思った。

そこで以前ちょこっとやったサーブレットの「セッション」について思い出して、これをなんとかAS化できないかと思ったら意外とすんなり気持ち良く再現できた。やり方はSessionクラスをシングルトンで作って、Session#getSession()のファクトリメソッドに加えて、内部に連想配列を持たせてSession#setProperty()、Session#getProperty()を定義してプロパティ名と値を連想配列で関連付けてやればいい。

このとき、Sessionクラスはシングルトンとしてstatic変数に入れておくことで、Flashが終了するまでメモリに常駐して、共有される。まさにセッションそのもの。

ステキ。

配列が早いか、XMLが早いか

ActionScript // 2009年03月15日 - 09:19

なんかそろそろActionScriptっていうカテゴリがあってもいいような気がしてきた。

2,500件の商品名が書かれたシンプルなXMLから
・配列に格納して出力
・XMLを生成して出力
両方の速度差を検証してみた。
今回はネットブックを使用したため、デスクトップPCと比べるとかなり遅い結果になるはず。

配列に格納して出力した結果

XML取得完了: 146(ミリ秒)
配列作成(push)完了: 172(ミリ秒)
appendTextループ開始: 172(ミリ秒)
appendTextループ完了: 9511(ミリ秒)

XMLを生成して出力した結果

XML取得完了: 139(ミリ秒)
XMLツリー作成(appendChild)完了: 8118(ミリ秒)
appendTextループ開始: 8118(ミリ秒)
appendTextループ完了: 17492(ミリ秒)

appendText開始~完了までは配列、XMLそれぞれ9.339秒、9.374秒なのでそれほど差はなかった。大きく違うのは配列にpushする時間とXMLツリーを生成する時間の差。今回の検証ではなんと7.946秒もの差が出た。この差はかなりでかい。

結果としては値を取り出す速度は互角だが、XML#appendChild()よりもArray#push()の方が50倍近く速いということがわかった。当然、データを取得するリソースとしてすでにXMLを取得している場合はXML#appendChild()を使うこともないんだけど。

get/set

ActionScript // 2009年03月12日 - 08:41

クラスのプロパティを外から変えた時にイベントを送出したいと思った。Java(Bean)の影響もあってずっとゲッターとセッターを定義してやっとったんだけど、このたびgetとsetというAS独自の修飾子を習得した。

Aクラス内
private var _message:String;
public function set message(param:String):void
{
  _message = param;
  trace(param);
}

別のクラスで
Aインスタンス.message = "メッセージ";
やるとトレースされる。

つまりgetまたはset修飾子をつけた関数の関数名はそのまま変数名として扱われるわけですな。当然、関数がパブリックならパブリック変数として外部からの書き換えを許すわけです。これ簡単でステキ。

パフォーマンステスト

ActionScript // 2009年03月08日 - 21:42

繰り返し処理にはいろんな方法がある。おなじみのfor文から、for each..in文、while文など。配列から値を取り出して何かやる場合、どんな方法が一番速いんだろう?と思ってやってみた。

処理の内容は
1) 0~9999までの数値を配列にプッシュ。10000個の要素を持った配列ができる。
2) 配列の中身を順に取り出して、テキスト出力する。
3) すべての要素を出力したら終了。
これをそれぞれやり方を変えて3回測定する。

前処理

var array:Array = new Array();
for (var i:int = 0; i < 10000; i++ )
{
  array.push(i);
}

速度テスト

[1]for文:いつものパターン

for ( var j:int = 0; j < array.length; j++ )
{
  textarea.appendText(array[j] + "\n");
}

結果:
1回目測定:17.772秒
2回目測定:18.696秒
3回目測定:18.474秒
平均:18.314秒

[2]for文:IE+JSだと効果のあるパターン

for ( var j:int = 0; j < array.length; j++ )
{
  var num:int = array[j];
  textarea.appendText(num + "\n");
}

結果:
1回目測定:17.855秒
2回目測定:18.067秒
3回目測定:18.342秒
平均:18.088秒

[3]for文:lengthをあらかじめ変数に格納しておくパターン

for ( var j:int = 0,len:int = array.length; j < len; j++ )
{
  var num:int = array[j];
  textarea.appendText(num + "\n");
}

結果:
1回目測定:18.009秒
2回目測定:18.526秒
3回目測定:18.473秒
平均:18.336秒

[4]for each..in文

for each(var str:int in array)
{
  textarea.appendText(str + "\n");
}

結果:
1回目測定:18.067秒
2回目測定:18.726秒
3回目測定:18.579秒
平均:18.457秒

[5]while文

var j:int = 0;
while (j < array.length)
{
  textarea.appendText(array[j] + "\n");
  j++;
}

結果:
1回目測定:18.226秒
2回目測定:18.652秒
3回目測定:18.623秒
平均:18.500秒

平均値

[1]18.314秒
[2]18.088秒
[3]18.336秒
[4]18.457秒
[5]18.500秒

結果としては[2]for文:IE+JSだと効果のあるパターンが一番速かった。ただ、一番遅かった[5]while文との差はわずか0.412秒しかなく、PCのヘルス状態にも左右されるためこれは誤差範囲なのかも。まぁ、最終的な結果としてはどれも変わらないといったところで、「慣れたやり方でできる」のが結論といったところでしょう。ちなみに今回はFlash Player 10.0 r12でテストしました。

ローカルフォントの取得

ActionScript // 2008年12月18日 - 09:35

Action Script 3.0でローカルフォントを取得するときは Font.enumerateFonts(true); で取得する。引数はローカルからフォントを取得するかどうかを指定するもの。

フォントは一回呼び出せばメモリに展開されるのだと思ったら大間違いだった。というのも、フォント名を一覧するのにまずこのメソッドを呼び出してローカルフォントの配列を取得。次にforで回すんだけど、 回す回数と、フォント名を取得する箇所両方でそのまま使ったら激重になってしまった。

よくよく考えてみると、staticメソッドなのでメソッドを呼び出す度にフォントの配列を取得していたことに気づく…。要はforブロックの外で一旦変数に入れてしまえばいいわけでした。

Flash Lite 3.0 テスト

ActionScript // 2008年12月13日 - 14:10

http://shacolon.ddo.jp/~filehost/fltest/enterframe.swf
(ソース:http://shacolon.ddo.jp/~filehost/fltest/enterframe.fla)

・onEnterFrameが使えるか?
・onReleaseが使えるか?
・attachMovieが使えるか?
・setMaskが使えるか?
・座標取得できるか?
・アルファ値が使えるか?
・PCで表示できるか?

これ全部成功。

フィルターは使えないみたいだから
ActionScript2.0 + Flash Player 7と同等のことができると判断。
すてき・・・!!!