16.外部画像をまとめて読み込むクラス2
読み込み速度が遅い?
前頁の追記になります。
実は、全頁で示した画像をまとめて読み込むクラスを使ってて、あれ?と思うことがありました。
読み込む画像のトータルのバイト数はそれほど大きくないのに、読み込み完了までの時間が妙に長いのでは?と。
よくよくスクリプトを見ると、昔で言うところの onEnterFrame の中で、loadingstepという値でどんな処理をするか、を決めているのですが、よく考えると1つの画像を読み込むのにどんなに早くても数フレームに進まないとだめなことになります。
つまり、画像のバイト数が少なくて、ホントはあっという間に読み込み完了となるのに、数フレームかけて次の画像を読み込む、ということが起きているのかも?
試しに、通常24に設定しているFPSを100にしてみると、読み込み完了までの時間が短くなりました。
あぁ、やっぱりここで引っかかっていたんだ、、、(^^;
修正版
while文の中で読み込ませたりすると(おそらくだけど)最悪の場合タイムアウトでだめになったりするんじゃなかったかな?
ということで、極力不要なステップを刻まずに読み込むようにしてみました。
なお、配列に入れる画像ファイル名が空白ならSKIPできるようにもしています。
修正したクラスのスクリプトが以下のようになりました。
また修正するかもしれませんけどね?!
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
public class imageloader extends Sprite {//クラス宣言
private var imageArr:Array=new Array();//画像ファイル名の配列
private var retArr:Array=new Array();//画像格納して返すための配列
private var flagfinish:Boolean=false;
private var tprog:Number;//ロードした割合(0〜1)
public function imageloader(imagearr_hk:Array){//コンストラクタ
imageArr=imagearr_hk;
loadimages();
}
//////////////////////////////////////////////////////////////
public function loadimages():void {
var myimg:Loader;
var imnum:uint=0;
var rate:Number;
imnum=setloadfile(0);//最初の画像設定
addEventListener( Event.ENTER_FRAME, loading_EF );
function loading_EF(eventObject:Event):void {//画像のロード
rate=myimg.contentLoaderInfo.bytesLoaded/
myimg.contentLoaderInfo.bytesTotal;
rate=(!rate?0:rate);//値がない時0でないので
tprog=1/imageArr.length*imnum+rate/imageArr.length;
if ( (rate >= 1)&&(myimg.contentLoaderInfo.bytesTotal > 30) ){
retArr.push({ mc:myimg , mcname:imnum });
//終了かどうか?
imnum++;
if (imnum == imageArr.length){//終了
removeEventListener( Event.ENTER_FRAME, loading_EF );
flagfinish=true;
}else{//次を読み込む
imnum=setloadfile(imnum);//設定
}
}
}
function setloadfile(num:uint):uint{//読み込む画像を設定する
while(1){
if(imageArr[num].imagename){//ある場合のみ通常処理
myimg = new Loader();
myimg.load(new URLRequest(imageArr[num].imagename+
"?n="+new Date().getTime()));
break;
}else{//ない場合はSKIPする
retArr.push({ mc:false , mcname:num });
num++;
}
}
return(num);
}
}
public function isfinish():Object {
//進捗を報告するメソッド
return { flagfinish:flagfinish , tprog:tprog };
}
public function getimages():Array {
//得た画像を返すメソッド
return(retArr);
}
}
}
これに書き換えたところ、30ちょいの小さい画像を読み込むのに4.3秒くらいかかっていたのが、1.4秒くらいになりました。
めでたし、めでたし(^^)