ゲーム プロジェクトで発生した予期しないメモリ リークを分析していたところ、奇妙な結果が見つかりました。私は Adobe 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 を使用しています。