SEP
17
2009

MultiProgressManager

少し前にspark projectで公開されたMultiProgressManagerを使ってみました。
ちょーいいよ、これ。
詳しくは作者さんのブログで丁寧に説明されてます。
僕的にProgression+Threadとの相性がすごく良いように感じたので、試してみました。

まずspark projectのリポジトリから必要なファイルをチェックアウト。
http://www.libspark.org/svn/as3/MultiProgressManager
同梱されてるサンプルもすごくためになる感じなので、見ておくと良いと思います。

んで、必要なファイルを適当な場所においてクラスパスを通せば準備完了。
サンプルを見る限り、本当はpreLoaderから本体swf読み込み、その後xmlやその他assetのローティングというように、つなげていくのがよさげみたいですが、今回はわかりやすいように、本体swf読み込み後のconfigからassetの読み込みまでをやってみました。

Progressionを使って、IndexSceneのonLoad内でローディング用のThreadを3本立ててやってます。
onLoad内は至ってシンプル。MultiProgressManagerインスタンスはThread内部でも利用したいので、データ保持用のsingletonオブジェクトに渡しておいてやります。
というかMultiProgressManagerはそれ自体singleton版があるようなのでそっちを使ってもよいかと。いや多分そっちのがいいです。ローディング終わったら使わないし。(SiMultiProgressManager)

protected override function _onLoad():void
{
	_data = DataRef.getInstance(); //データ保持用のsingletonオブジェクト
	_multiProgress = new MultiProgressManager(); //ここでMultiProgressManagerインスタンスをつくる
	_multiProgress.addEventListener(ProgressPercentEvent.PERCENT_PROGRESS, handlePercentProgress);
	_data.multiProgress = _multiProgress; //ローディング用Thread内から参照できる様に_data内部に保持
	_preLoader = new PreLoadView(); //ローディング状況を表示するためのView

	addCommand(
		new AddChild(_data.container, _preLoader, { child : { x: 20, y: 20 } }),
		new ThreadCommand(new XMLLoadThread(_data), { timeOut: 0 }),
		new ThreadCommand(new AssetLoadThread(_data), { timeOut: 0 }),
		new ThreadCommand(new BgLoadThread(_data), { timeOut: 0 }),
		new Listen(_multiProgress, ProgressPercentEvent.PERCENT_COMPLETE),
		new RemoveChild(_data.container, _preLoader)
	);
}

private function handlePercentProgress(e : ProgressPercentEvent):void
{
	_preLoader.update(e.percent);
}

ローディング用の各Thread内部の読み込み部分では、だいたい以下のようなことをやってます。

protected override function run():void
{
	_multiProgress = _data.multiProgress;
	_urls = //ここに読み込む画像のパスが入ったArray
	next(load);
}

private function load():void
{
	_bgLoader = new ParallelExecutor();
	for(var i:int = 0; i < _urls.length; i++)
	{
		var req : URLRequest = new URLRequest(_urls[i]);
		var ld : LoaderThread = new LoaderThread(req);
		var md : AbstractProgressModel = new ProgressEventModel(ld.loader.contentLoaderInfo, 0.3 / _urls.length); //第二引数でこの読み込み自体が全体の読み込みの内、どの程度のウェイトをしめるかという設定が出来る
		_multiProgress.addProgress(md); //ここでロード状況をマージ

		_bgLoader.addThread(ld);
	}

	_bgLoader.start();
	_bgLoader.join();

	next(handleBgLoadComplete);
}

なんかわかりにくい説明になってしまいましたが、とにかく便利です。というか使い方これでいいのかなという不安もあるくらいなので、同梱のサンプルに目を通してもらった方がわかりやすいですね。。

とにかく、Progressionを使用する時は大体IndexSceneのonLoadとかで必要な読み込みなどはほとんどやってしまうと思うのですが、その際に読み込む種類毎にThreadを立てて、それらの監視状況をMultiProgressManagerに一元化すると、ローディング周りのコードの見通しがよくなるし、すごくシンプルにかけるじゃないか!ということが言いたかったわけです。
しかも進捗状況にスムージングまでつけてくれるので、view側で丸め込んだりしなくて良いのもうれしい。

多分まだちょっとしか使ってないので、おかしな使い方をしているのかもしれないけど、個人的にはすごく重宝しそうです。
感謝感謝!

Category : actionscript

0

No Comments.

form

Leave a comment.

back2top