質問

まだロードせずにロードしようとしているファイルのファイルサイズを見つける簡単な方法を探しています。基本的に、ロードする必要のあるファイルのバッチを作成していますが、総負荷がどれくらいになるかを事前に決定できれば非常に便利です。

フラッシュ内のLoaderオブジェクトにはtotalBytesプロパティがありますが、既にファイルをロードしている場合にのみ値を返します。

役に立ちましたか?

解決

ロードされたということは、完全にロードされたということですか、それともロードを呼び出さないことですかロード呼び出しが受け入れられる場合、次の方法が役立ちます。 progressイベントは、最初の起動時に受信データの合計サイズを提供します。特定のprogressイベントを発生させて、現在の読み込み項目の合計値を取得し、それを独自の_total変数に追加するだけです。データプロバイダー(配列、xmlなど)が空になるまでこれを続けます。最終的には、すべての資産の合計が得られます。

package
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.URLLoader;
    import flash.URLRequest;

    public class ExampleDocumentClass extends Sprite
    {
        private var _urlLoader:URLLoader;
        private var _loader:Loader;
        private var _request:URLRequest;
        private var _total:Number;
        private var _array:Array;

        public function ExampleDocumentClass():void
        {
            if(stage) _init;
            else addEventListener(Event.ADDED_TO_STAGE, _init);
        }
        private function _init(e:Event = null):void
        {
            _array = [{type:"nonDisplay", path:"path/to/file"},{type:"display", path:"path/to/file"}];
            _urlRequest = new URLRequest();

            //Non display asset
             _urlLoader = new URLLoader();
            _urlLoader.addEventListener(ProgressEvent.PROGRESS, _onProgress);

            //Display asset
            _loader = new Loader();

            loadAsset();
        }
        private function loadAsset():void
        {
            if(_array.length > 0)
            {
                var pObj:Object = _array[0];
                if(pObj.type == "nonDisplay")
                {
                    loadNonDisplayAsset(pObj.path);
                }
                else
                {
                    loadDisplayAsset(pObj.path);
                }
                //Remove this item from the array;
                _array.shift();
            }
        }
        private function loadNonDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _urlLoader.load(_urlRequest);
        }
        private function loadDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, _onProgress);
            _loader.load(_urlRequest);
        }
        private function _onProgress(e:ProgressEvent):void
        {
            _total += e.bytesTotal;
            _loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
            _urlLoader.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
        }
    }
}

したがって、サイズの合計を独自の_total変数に追加するのに十分な長さのアセットをロードし、配列内の次のアイテムを呼び出して、データプロバイダーが空になるまでその合計を追加します。明らかにこれはXMLで行うことができますが、希望する場合でも、配列は演習で使用したものです。

他のヒント

Actionscript 3 からファイルのサイズを取得する方法はありません。簡単な解決策は、すべてのファイルをスキャンしてその名前とサイズをswfに返す小さなスクリプトをサーバーに追加することです( JSON または XML など) 。

ActionScriptでこれを行う方法はありません。これを行うには、サーバー側のコードが必要です。ファイル名を取り、合計バイト数を返すメソッドを作成できます。

actionscriptでこれを行う方法はわかりません(私は第一人者ではありません)が、最初の推測は、PHPスクリプト(または他の任意のスクリプト言語)を使用してファイルサイズを取得し値。

別の(おそらく過剰な)方法は、ファイルのヘッダー(ファイルサイズを含む)をサーバーに単に要求するものを作成することです。 同じことは、ファイルサイズの取得時にファイルのダウンロードを開始し、ストリームを閉じる(かなり高速)か、ファイルのサイズをサーバーに要求する他の方法(前述のように)複数のファイルを読み込んでいて、読み込む前にファイルサイズを知る必要があります)

Brian Hodgeが提供するメソッドと、特定のフォルダー内のすべてのファイルの合計サイズを取得して返すために変数(XMLからの文字列としてのフォルダーの場所)をPHPに送信する別のメソッドを試しましたフラッシュへのデータ。

楽園のプリロードへの旅で遭遇した大きな問題の1つは、Flash Playerがファイルサイズに関して一貫性のない結果を生成するように見えることです。まったく同じファイルを2回読み込んだとしても、Flashはサイズが異なることを教えてくれます...時々。

これにより、代替(PHP)メソッドでも問題が発生しました。PHPスクリプトは、Flashで生成されたものと一貫性のない(一見)正確なファイルサイズの結果を生成し、ローダーが85%または128%に依存するためですキャッシュとFlashのムードについて:/

bulk-loader という優れたクラスを優先して、両方のメソッドを廃止しました。 、キューに入れられた読み込みと複数のアイテムの進行状況の追跡などを可能にします:D

swfファイルのサイズが大幅に増加することに注意してください...皮肉なことです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top