0

as3サウンドオブジェクトを単に新しくしたように見え、その参照をnullに戻すと、SoundChannelの再生に使用されたかどうかに関係なく、メモリリークが発生します。

たとえば、次のテキストコードを使用します。

package 
{
    import flash.display.*;
    import flash.events.*;
    import flash.media.*;
    import flash.system.*;
    import flash.utils.*;
    import flash.system.*;

    public class Main extends Sprite 
    {
        [Embed(source = "../data/SongScene8.mp3")] protected var SongScene8:Class;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            System.gc();
            trace("Before");
            trace(System.totalMemory);
            trace("_________________")

            var sound:Sound = new SongScene8();
            System.gc();
            trace("After new");
            trace(System.totalMemory);
            trace("_________________")

            sound = null;
            System.gc();
            trace("After null");
            trace(System.totalMemory);
        }
    }

}

出力は次のとおりです。

3461120より前


新しい3604480の後


null後3604480

gcが1000回実行されても、最後の値は残ります。

そのため、サウンドチャネルが再生されているかどうかに関係なく、サウンドオブジェクトをメモリから削除できないように見えます。

私が間違っていると言って、その理由を教えてください。前もって感謝します。

4

1 に答える 1

-1

少し息をしてみてください。記憶がすぐに解放されない場合があります。

sound = null;
System.gc();

trace('After null');
trace('Instantly: ' + System.totalMemory);
setTimeout(function():void
{
    trace('2 seconds later: ' + System.totalMemory);
}, 
2000);

System.gcまた、AIR およびデバッガー バージョンの Flash Player でのみ機能することにも注意してください。

gskinner の古い記事によると、 LocalConnection.connect2 回呼び出して即時リリースを強制するトリックがあります。それがどれほど信頼できるかはわかりませんが、簡単なテストでは、それが機能しているように見えます:

sound = null;

try {
    new LocalConnection().connect('foo');
    new LocalConnection().connect('foo');
} catch (e:*) {}

trace('After null');
trace('Instantly: ' + System.totalMemory);
于 2012-10-29T22:55:54.523 に答える