0

実行時にオブジェクトをクラスからシーンにインスタンス化し、コードを使用してこれらのオブジェクトを削除する必要があるフラッシュ ゲームに取り組んでいます。これは正常に機能し、ゲームからインスタンスを動的に追加および削除できますが、約 2 分後に極端に遅れ始め、最終的にはすべてクラッシュします。

以前numchildren()はシーン内のオブジェクトの数を追跡していましたが、追跡された数が増加し、最終的に 2000 オブジェクト近くに達するため、一部のインスタンスが適切に削除されていないようです...

オブジェクトを削除するために使用removeChild()していますが、これらのオブジェクトがまだシーンにある理由を理解しようとしています。オブジェクトが適切にリセットされていない場合、オブジェクトがまだCPUを使用している可能性があることをどこかで読みました。

私はまだフラッシュで作業するのが初めてで、主な質問は、削除されていないオブジェクトをどのように見つけて、ゲームから完全に削除するのですか? 単純な部分
以外に、コードに何を追加する必要がありますか? どんな助けでも大歓迎です。removeChild()

4

1 に答える 1

0

removeChild() メソッドが使用されているコード部分を提供してください。

通常、 removeChild() は次のように使用する必要があります。

import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;

var movieClip:MovieClip;
var timer:Timer=new Timer(5000, 1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);

makeMovieClips();

function makeMovieClips() {
    for (var i:int; i<2000; i++) {
        movieClip=new MovieClip();
        movieClip.graphics.beginFill(Math.random()*0xFFFFFF);
        movieClip.graphics.drawCircle(Math.random()*stage.stageWidth, Math.random()*stage.stageHeight, Math.random()*40);
        movieClip.graphics.endFill();
        addChild(movieClip);
    }
    trace (numChildren) // should output 2000;
    timer.start();
}

function onTimerComplete(e:TimerEvent):void {
    while (numChildren>0) {
        movieClip=getChildAt(0) as MovieClip;
        removeChild(movieClip);
        // or we can use removeChildAt(0); instead of 2 lines above
    }
    trace (numChildren) // should output 0, because all objects are removed from display list;
}

さらに、表示リストからオブジェクトを削除しても、それらのオブジェクトに参照が残っている場合はメモリから除外されないことに注意してください。この例では、すべてのムービークリップがステージから削除された後も 1 つのムービークリップ オブジェクトへの参照が残るため、VM のメモリの一部を占有し、ガベージ コレクターはその部分を消去しません。私の例では、参照を削除するには、onTimerComplete メソッドの while ループの後に次のコード行を追加する必要があります。

movieClip=null;
于 2012-12-02T13:43:52.483 に答える