「そうめん」で作る「情報視覚化」(4)
2009/02/25 22:01 - AS3.0
「ビジュアライジング・データ」第3章に触発されて作った都道府県の面積を表示する日本地図の各ソース説明の続き。
なぜ単なる表示物をスレッドにするのか
Dot を Sprite のサブクラスとした場合、マウスイベントリスナーの付加は MainThread でおこなうことになりますね。 コードは以下のような感じ。
addMouseEvent 以前のメソッドで複数生成された表示物(クラス名 Dot)が dots という配列に格納済みであると考えてください。
前回、DotThread のマウスイベント管理部門として説明した3者と同じですね。
ところで 以前、「そうめん」の優れた点としてイベントリスナーの remove を一切意識しないで済むということを述べました。
なぜ意識しなくてよいのかというと、ライブラリ側で自動的に removeEventHandler を実行しているからです。
ではその removeEventHandler はいつ実行されるのか。
それは当該イベントが実行されたときです。
上のコードを例に取ると、具体的には以下のようになります。
- addMouseEvent
- すべての Dot インスタンスに MouseEvent.ROLL_OVER のハンドラが登録される
- rollOverHandler
- すべての Dot インスタンスから MouseEvent.ROLL_OVER のハンドラが削除される
- すべての Dot インスタンスに MouseEvent.ROLL_OUT のハンドラが登録される
- rollOutHandler
- すべての Dot インスタンスから MouseEvent.ROLL_OUT のハンドラが削除される
で、ここで問題にしたいのはイベントハンドラが remove される部分です。
今回作ったサンプルですが、マウスのロールオーバーが発生する Dot は、いちどきに一つだけです。
たとえば、北海道を表す Dot にロールオーバーが発生しているとき、他の都府県の Dot ではロールオーバーは発生しません。
つまり rollOverHandler → rollOutHandler → addMouseEvent のループは当該 Dot だけで発生してくれれば事は足りるわけです。
しかし、上記コードのように MainThread で、複数の Dot に一括で event メソッドを適用すると、どれか一つの Dot でロールオーバーが発生すると、MainThread のrollOverHandler 実行時にすべての Dot の MouseEvent.ROLL_OVER のリスナーが削除されます。
ロールオーバーが発生した Dot は一つだけなのに、removeEventListener はすべての Dot で発生するのです。
1個の Dot にマウスイベントが発生するたびに、47個の Dot 全部に対して addEventListener や removeEventHandler が発生するのはどうも不経済な気がします。
47個程度ならそれほど大した処理量にはならないかもしれないけれど、これが何万個も対象にしていたら、それはやっぱり処理速度に反映するでしょう。
また、今回のような事例なら、全ての Dot のイベントリスナーが同時に削除されてもプログラムの運行上問題はありません。
しかし複数あるインスタンスのイベントリスナーがすべて同時に解除されては困る事例というのもあります。
次回は、かつて「そうめん」でプログラミングしていて、上記のような全インスタンスイベントリスナー同時解除に遭遇して挫折した、そんな経験談です。