1

ゲーム プロジェクトで発生した予期しないメモリ リークを分析していたところ、奇妙な結果が見つかりました。私は Adob​​e Scout を使用してプロファイリングを行っており、ムクドリ、テクスチャ、読み込みライブラリなどの他のすべての要因を排除しました。コードを縮小して、単純に png をロードし、完了イベントで空のインライン関数をすぐに割り当てました。

png を読み込むと、デフォルトで画像が割り当てられます。gc を読み込んだ後に何もしないと、その画像がクリアされます。しかし、インライン関数を作成すると、その画像が何らかの形でガベージコレクションされるのを防ぐようです。私のテストコードは;

public class Main extends Sprite 
{
    private var _callbacks:Array = new Array();

    public function Main() 
    {
        load("map.png", onPngLoaded);
    }

    private function onPngLoaded(bitmap:Bitmap):void 
    {
        _callbacks.push(function():void { });
    }

    public function load(url:String, onLoaded:Function):void 
    {
        var loader:Loader = new Loader;

        var completeHandler:Function = function(e:Event):void {
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
            onLoaded(loader.content);
        }

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

        loader.load(new URLRequest(url));   
    }
}

インライン関数を作成するコードを削除すると、

    private function onPngLoaded(bitmap:Bitmap):void 
    {
        // removed the code here!
    }

gc が機能し、メモリからイメージをクリアします。

これについて論理的な説明がないため、flash / as3 のバグが疑われます。私のコードをテストして同じ結果を得たコメントをお待ちしております。

注: テストするには、空の as3 プロジェクトのメイン クラスをコードとインポート パッケージに置き換えます。任意の png を読み込むことができます。flashdevelop、flex-sdk 4.6.0、および flash player 14 を使用しています。

4

2 に答える 2