0

インスタンスを削除して別のインスタンスに置き換えるために使用する関数に問題があります。基本的に、何があってもアイテムをメモリに保持します。オブジェクト内には弱いリスナーがあり、削除された後にすべてを無効にしますが、まだアクティブであるかどうかを確認するために実行する関数は、それがアクティブであることを示します (Event.ENTER_FRAME が弱いリンクを含むテキストをトレースするだけです)。

ロードしているインスタンスからすべてを削除した場合でも、トレースによると、まだメモリに残っているようです。ステージから削除した後に無効にするよりも、メモリから何かを完全に削除するにはどうすればよいですか? 私は何かを見ていませんか?

これは機能です:

private function loadArea(inputArea:String)
            {                      
                    //This is for a checker to make sure that areas only get loaded once.
                    currentRoom = inputArea;

                    //If the area currently loaded is not null, make it null now.
                    if(selectedArea != null) selectedArea = null;

                    //Null any data inside of the reference used to create the name of the new area.
                    areaReference = null;
                    //Grab the class using the input.
                    areaReference = getDefinitionByName(inputArea + "Area") as Class;

                    //Null the sprite used to house the class
                    areaSprite = null;
                    //Set the holder as a new instance of the desired class.
                    areaSprite = new areaReference() as Sprite;

                    //If the selected area is still not null for some reason,
                    if(selectedArea != null)
                    {
                            //Remove the area from the container...
                            areaContainer.removeChild(selectedArea);
                            //...and nullify it.
                            selectedArea = null;
                    }

                    //Set the current area as the newly created instance.
                    selectedArea = areaSprite;

                    //If the area is not the "Game", load in the assets one way,                   
                    if(inputArea != "Game") selectedArea.construct(areaAssets);
                    //otherwise do it another way.
                    else selectedArea.construct(newScreenData,apiServer,cdnServer,areaAssets);

                    //This is for a checker that fades out the screen, which it needs to fade back in soon.
                    newScreenData = null;

                    //While the container for areas has any areas inside of it, remove them.
                    while(areaContainer.numChildren) areaContainer.removeChildAt(0);

                    //...then add the new instance area to the container.
                    areaContainer.addChild(selectedArea);

                    //...then let all the parts of the game know that a new area has been laoded in.
                    Global.echoEvent.echo("gameBootUp","playAreaIn");
            }
4

3 に答える 3

3

ガベージ コレクターが孤立したインスタンスを見つけて消去すると、メモリは実際に解放されます。その前に、メモリ使用量は、メモリ内にインスタンスがあることを示しています。ガベージ コレクションを強制する方法はなく、System.gc()Flash に実行を「指示」するだけで、従わない可能性があります。だから、あなたはあなたがしなければならなかったことをしました。

于 2013-01-16T11:24:48.287 に答える
1

ステージを含むすべての参照を削除し、オブジェクトをnullにするだけで、メモリを解放できます。

オブジェクトが解放されていない場合は、何かが欠落しているか、何かが間違っているか、順序が狂っています。

コードを注意深く調べ、オブジェクトが参照されている場所を特定して、オブジェクトを削除できるようにしてください。

サンプルコードを見てください:

if(selectedArea != null) selectedArea = null;

ここでは、selectedAreaがnullであることを確認しています。ただし、selectedAreaを再度テストした直後(nullであることがわかっているため、このブロックは使用されません)

if(selectedArea != null){
//Remove the area from the container...
areaContainer.removeChild(selectedArea);
//...and nullify it.
selectedArea = null;
}
于 2013-01-16T11:13:25.220 に答える
0

すべての言語で、メモリを「クリア」するのは非常に困難です... HTMLでさえ。そうは言っても...メモリフットプリントを減らしてみてください。

Correct Null:
1. remove all event listeners
2. remove all children
3. remove all mapped/referenced methods/parameters
4. set the class object to null

ほとんどの場合、これだけで十分です。その方法によって、オブジェクトがクリアされるかどうかが決まります。次の状況を考えてみましょう。

マップされたプロパティを持つカスタム スプライト クラス (MEMORY FOOTPRINT #1) があります (マッピングは、あるクラス オブジェクトが別のオブジェクトを参照するときに発生します)。あるオブジェクトを別のオブジェクトにマップ/参照したら = MEMORY FOOTPRINT #2. イベントの追加 = MEMORY FOOTPRINT #3 など。

カスタムスプライト

import flash.display.Sprite;

class CustomSprite extends Sprite{

    private var _mappedProperty:Object;

    public function addMapping(map:Object):void{
        _mappedProperty = map;
    }

    public function finalize():void{
        _mappedProperty = null;
    }
}

他の多くのメソッドで CustomSprite を使用していると仮定して、オブジェクトを削除する一般的な方法を見てみましょう。

不正解 - この状況では、[ objToRemove ] はメモリを解放するために null に設定されませんでした:

var objToRemove:CustomSprite = new CustomSprite;

function doSomething(referenceObj:CustomSprite):void{

    var methodObj:CustomSprite = referenceObj;

    //CRAZY LINES OF CODE

    methodObj = null;       //frees memory from [doSomething::methodObj]
    referenceObj = null;    //frees memory from [doSomething::referenceObj]

    //objToRemove is not cleared and will remain in memory
}

不正解 - この状況では [ objToRemove ] に参照オブジェクトがあるため、参照が削除されるまで消去されません。

var objToRemove:CustomSprite = new CustomSprite;
var mappedObject:Sprite = new Sprite;

objToRemove.addMapping(mappedObject);       
objToRemove.addEventListener(Event.ENTER_FRAME,onEnterFrame);

//CRAZY LINES OF CODE

//remove all children
while(objToRemove.numChildren > 0){
    objToRemove.removeChildAt(0);
}

//remove all event listeners
objToRemove.removeEventListener(Event.ENTER_FRAME,onEnterFrame);

//this will NOT work
objToRemove = null;

//reason is objToRemove has a reference object of [mappedObject]
//[mappedObject] is not a child so it needs to be removed manually
//from WHITIN the CustomSprite class using [CustomSprite::finalize()]

わかりました...息...正しい方法は実際には簡単です。

正しい- ここでは、[静的] クラス オブジェクトではなく [動的] オブジェクトを使用しています。これは、オブジェクト マッピングと見なされます。

//think of this as a global list of objects
var objPool:Dictionary = new Dictionary;

//create a pool reference
objPool['poolObj'] = new CustomSprite;

//CRAZY LINES OF CODE;

//do the normal [null] process

//both of these will work
objPool['poolObj'] = null;
//or
delete objPool['poolObj'];

SUPER ADVANCED CORRECT - 例が提供されていません。私は仕事に戻らなければなりません笑...

1. Take a ByteArray clone of the class
2. User a Loader to construct the ByteArray as the class, rather than using "new"
3. When finished... unload/remove the loader
4. EVERYTHING will clear... thats how a Loader works! 
(Not getting into why and how... too long of an explanation)

これは問題なく動作しますが、作業環境で一般的に受け入れられたり、提案されたりすることはありません。

于 2013-01-16T17:11:37.137 に答える