私はFlashエディターから画像をレンダリングするAIRアプリケーションを持っています。複数のサーフェスをカスタマイズすることができます。サーフェスはすべて同じ幅と高さを持ちます。その後、各サーフェスはAIRアプリケーションによってレンダリングされます。ビットマップデータメモリリークのAS3描画Sprite
メモリリークに苦労しています。私は対処できません。
レンダリングが必要な各サーフェスには、多くのコンポーネント(他のスプライト - イベントリスナー、ビットマップデータ、その他の子コンポーネント、スプライトなどを含むスプライト)があります。私はすでにゴミを収集するのBitmapData問題を認識してい
は、私は両方をテストした:
それぞれ(処分後、レンダリングのための新しいのBitmapDataを作成- )とポイントの単一のBitmapDataを再利用
- をゼロにするために各レンダリング
メモリリークはまだ等しく発生しています。
var bm:BitmapData = new BitmapData(destDim.x, destDim.y, true, bgColor);
var mtx:Matrix = new Matrix();
trace('before drawing :'+(System.privateMemory/1024));
bm.draw(myBigSprite, mtx, null, null, null, true);
trace('after drawing :'+(System.privateMemory/1024));
var result:Bitmap = new Bitmap(bm, PixelSnapping.NEVER, true);
//return result and encode Bitmap to png
result.bitmapData.dispose();
result.bitmapData = null;
result = null;
結果::私は描画機能の動作中に何かが欠けているように私は感じ
before drawing :208364
after drawing :302816
Wrote bitmap to file: surface0.png
before drawing :303296
after drawing :446160
Wrote bitmap to file: surface1.png
before drawing :446160
after drawing :565212
Wrote bitmap to file: surface2.png
before drawing :565924
after drawing :703100
Wrote bitmap to file: surface3.png
before drawing :703572
after drawing :834420
Wrote bitmap to file: surface4.png
は、ここに私のループです。私は、描画操作後も持続するmyBigSpriteのコンポーネントのインスタンスを新しく作成したようです。
私は、任意のヒントをいただければ幸いです
....それは何も変更しない、完全に各ループの最後でmyBigSpriteを破壊しようとしました!
あなたはどのようにガベージコレクションプロセスが実行されましたか?あなたはそれを強制するのですか?またサイドノートとして、System.gc()を呼び出すことによってgcを強制することは、私が知る限りデバッグプレーヤーでのみ動作します。 – Patang
描画操作の終わりから次の操作の開始までのメモリはほぼ同じですが、その間に多くのメモリを消費する操作があります。特にビットマップをpngにエンコードする。だから私はGCのプロセスは、私が掃除したいすべてのリソースが描画機能を除いて清掃されているので、その仕事をしていると仮定します。私はSystem.gc()を明示的に呼び出すことはありません。 – Bedu33
ビットマップデータへの参照を保持しているので、 "result"をnullに設定していますか? – Patang