0

swf をロードするプリローダーがあります。swf は一連のリスナー、オブジェクト、およびムービー クリップを作成します。これらすべてを破壊し、再構築してほしい。

私のプリローダーの簡易版:

var request:URLRequest = new URLRequest("myfile.swf");
var myLoader:Loader = new Loader();
var urlLoader:URLLoader = new URLLoader();


urlLoader.addEventListener(Event.COMPLETE, function(event){ 
    stage.addChild(myLoader);
    myLoader.loadBytes(urlLoader.data);
});

urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.load(request);

削除しようとすると、次のようにします。

stage.removeChild(myLoader);
var child = loader.myLoader.content as Object;
SoundMixer.stopAll();
while(stage.numChildren > 0){
     stage.removeChildAt(0);
}
child.stop();
while(stage.numChildren > 0){
     stage.removeChildAt(0);
}
child=null;

System.gc();
myLoader.unloadAndStop(true);
System.gc();
myLoader.unload();
System.gc();
myLoader.loadBytes(urlLoader.data);
stage.addChild(loader.myLoader);
4

4 に答える 4

2

ロードされたSWFで、すべてのリスナーを削除し、すべてのオブジェクトを破棄し、すべてのデータをリセットするメソッド「destroy」を作成できます。

このメソッドは、親オブジェクト(メソッドがパブリックの場合)から呼び出すdestroyことも、SWFをステージから削除するときに呼び出すこともできます(Event.REMOVED_FROM_STAGE)

于 2012-10-30T14:32:36.170 に答える
0

これが古いことは知っていますが、参考のために偶然見つけて、言及すべきだと思ういくつかのことを見ました。

System.gc() - アクセスできる関数ですが、かなりの量のメモリを使用してすぐに戻す必要がない限り、コードからガベージ コレクタを呼び出すべきではないことがわかりました。ガベージ コレクタは、通常、いつ実行すべきかについて、あなたよりも優れた考えを持っています ( AS3 でガベージ コレクションを強制しますか? )。アプリケーションだけでなく、そのブラウザーまたはコンテナーで実行されているすべてのフラッシュ アプリケーションのパフォーマンスに影響を与える可能性があります。

また、unloadAndStop() はさまざまな状況で信頼性が低いと思われるため、unloadAndStop() を効果的に使用するのに苦労している人もかなりいます ( unloadAndStop() メソッドを使用して swf をアンロードしますが、ビデオ サウンドは聞こえるままです)。

徹底的にするために、コンテナがそれを処理することを期待せずに、最初にロードされたフラッシュオブジェクト内から他の言語にあるようにすべてを単純に削除してから、フラッシュオブジェクト自体を削除することに力を入れることを強くお勧めします。これが、Flash がそもそもメモリ リークで有名な理由です。

ロードされた swf 内に、アンロード時に起動するコードを追加します。1 つの方法は、これを swf に追加することです。

this.addEventListener(Event.REMOVED_FROM_STAGE, doUnload)

次に、doUnload 関数に次のことを実行させます。

removeEventListener を使用して、イベント ハンドラーを効果的に終了します。作成したすべての addEventListeners を呼び出すか、実行中のオブジェクトをトラバースすることで、ウォークスルーしてそれらすべてを削除するルーチンを作成することができます。最初のオプションは排他的であるため、より効率的ですが、2 番目のオプションは、理論的には記憶してアプリケーション間でコピーできるものです。

変数に対して delete() を使用して、ガベージ コレクターによって変数を削除できるようにします。注: 多くの言語とは異なり、参照も削除されない限り、参照された変数は削除できません。例えば:

var a:int = 0;
var b:int = a;

delete(a); // b still exists and equals 0, a is not available to GC.
delete(b); // now both variables can be removed by GC.

また、removeChildAt(0) を使用するか、子オブジェクトを個別に削除するかについても、まだ混乱しています。1 つ目は明らかにシンプルでわかりやすいという利点がありますが、コーダーが完全には理解できず、unloadAndStop() と同様に何かを見落としている可能性があるという注意点もあります。removeChild を使用してオブジェクト ツリーをたどり、疑問や不確実性なしに明示的に物事を排除するほどではありません。

これが設定された後、フラッシュ オブジェクトをアンロードする関数を追加すると、その自己削除がトリガーされるため、ローダーはシンプルで整然としたままで、フラッシュをきれいにリロードします。

于 2014-05-02T23:01:25.487 に答える
0

js を使用して swf をリロードできます。これが簡単な方法です。この回答を確認できます。

または、適切なオブジェクトとリスナーの管理を行い、swf ファイルでゲームをリセットする必要があります。プロジェクトが大きくなるにつれて、これは複雑になる可能性があります。すべての参照とリスナーを削除するリリース メソッドが必要です。

于 2012-10-30T14:41:15.330 に答える
0

最初に、次のようにローダー クラスを使用して swf をロードする必要があります。

 var movie:MovieClip
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
        loader.load( new URLRequest("myfile.swf"));

        function loadComplete(event:Event):void
       {
        movie = loader.content as MovieCLip;
        addChild(movie);
       }


    //when reloading just remove the movie object from the stage

     removeChild(movie);
    SoundMixer.stopAll();
    //......
    //.
    //.
于 2012-10-30T21:08:08.120 に答える