非アクティブ時の処理「スロットル」とはなんぞや?

近況報告

 また久しぶりの更新です。
 一応、前に宣言した脱出ゲームを作り上げました。
 今のところ、脱出ゲーム(Rat & Rabbit)脱出ゲーム(Rat & Rabbit in Christmas)の二本です。
 それから、10年ほど前に作ったFlashアニメーションをアップデートしました。みちよ / メイド漫才です。

 未だに慣れてないActionScript3.0を使って、それなりのもの作っていこうと決意をしまして、ちょこちょこと新作を発表したり旧作をリメイクしたりしている現状です。

なんかタイミングがズレる

 ActionScript1.0で作ってたメイド漫才をActionScript3.0で動かしてみようと思ったのは、XMLの読み込みやパース、自作のフキダシコンポーネントなど、結構よく使う(予定(笑))の技術が入っているんで、まずコレを橋頭堡にするのが良かろう、という考えです。

 で、なんだかんだと躓きつつも一応移植に成功しました。

 でも、ブラウザの後ろのタブに行ったりウインドウを最小化したりして、非アクティブになった後、どーもオブジェクトの位置がズレるんですよ。
 原因を探ったところ、どうやらAdobe Flash Platform * CPU 使用率の最小化で書かれてる、低速処理が問題のよう。
 この非アクティブ時にレンダリングやめたり遅くしたりする機能は Flash Player 10.1 で導入されものらしく、これが表題のスロットルというやつみたい。
 んで、そこに書いてある通り Flash Player 11.2 でイベントflash.events.ThrottleEventが導入されて、Flash制作者側で挙動変化に対応できるようになった、という事のよう。

 メイド漫才の場合、グラフィックのレンダリングが行われていないのにタイマーイベントは動いていて、表示と内部の状態にズレがでてきちゃった、という事みたいだ。

修正を加えよう

 ThrottleEventについては、Flashプログラマなら知らない人はいない上条さんのページにも書いてある。コレ、Flash Player 11.2 と AIR 3.2 ベータ 4 公開 - akihiro kamijo
 それから、こちらのshohei909さんのブログ、FlashPlayer11.2の新機能とかまとめ。 | 机上のにゅーろん、なんかも参考にしつつ修正。

 以下のプログラムのtimerObjって変数が、メイド漫才で使われているflash.utils.Timerオブジェクト。

…
	this.addEventListener( ThrottleEvent.THROTTLE, throttleHandler );	// スロットルのイベントを登録
}

// 非アクティブ状態になった、あるいは復帰した時の処理
private function throttleHandler( e:ThrottleEvent ):void
{
	if ( e.state == ThrottleType.THROTTLE )
	{
		timerObj.stop();
	}
	else if ( e.state == ThrottleType.RESUME )
	{
		timerObj.start();
	}
}

 stateがThrottleType.THROTTLEの時は非アクティブになった時にイベントが送られている。
 stateがThrottleType.RESUMEの時は非アクティブから復帰する時にイベントが送られている。
 わけなので、そのタイミングでタイマーを止めたり戻したりしている。
 これでひとまず解決したみたい。

時代に取り残され気味

 最近かなりFlashがないがしろにされてる雰囲気だけど、Flashブラウザゲームの艦隊これくしょん~艦これ~が大人気だったりして、なんだかんだでFlash使われてんなー、という感じです。
 それより、私がかなり取り残されてるよ!
 遅れを取り戻す(キャッチアップする)ために上条さんのブログをざっとでも目を通したおいた方がいいかもしれない。

 今日はここまで。