2011-02-15 4 views
2

Flexアプリケーションに問題がありますが、私が作成したものではありませんので、すべての調査結果を提供することはできますが、ビューからのFlex DisplayObjectの削除とメモリプール

7つのメインビューを持つFlexアプリケーションがあります。ビュー間を移動するときにメモリの問題があります。

これらのビューはすべてViewStackに含まれていましたが、3Dオブジェクトに関連するものがいくつかあるため、表示リストにすべてが含まれていると思っていました。私は現在スタックからすべての子をクリアし、必要に応じてそれらを追加/削除しています。これにより、パフォーマンスが少し向上しましたが、使用にはまだ反応しなくなりました。奇妙なことは、これと元の方法では、CPUは使用に乗っていますが、最終的にどこかに水平になります。今度は、各画面をナビゲートして前の変数をnullに設定すると、各画面の新しいインスタンスが作成されます。ビューが作成されたときにCPUが急上昇しているように見えますが、それよりはるかに低いレベルにレベリングしています。これは進歩のように感じましたが、利用可能なメモリはそれ以前には登場しませんでした。...

ガベージコレクタが次に実行されたときに、子を削除するか、すべての子を削除するとオブジェクトを削除マークにしました。私はインスタンスへの他の参照を見ることができません。私のコードは、行に沿って

this.parentApplication.viewstack.removeAllChildren();
this.parentApplication.viewstack.addChild(新しいホーム画面);

私は、各ボタンが上記のような新しいインスタンスを追加する機能を持っています。私が見ると尋ねる愚かな感じが、確認を必要とすることができます

唯一のことは、このクラスは、いくつかのコアコンポーネントをシングルトンの参照が含まれ、それぞれのビューは、「スクリーン」と呼ばれるクラスを拡張し

this.model = PancakeApplication.instanceですモデル。 this.meaModel = MeaApplication.instance.meaModel; this.meaModel.addEventListener(ScreenChangeEvent.SCREEN_CHANGE、electedScreenChangeHandler);

これはガベージコレクタを依頼して、それがまだ必要だと思ってしまうのですか? メモリプールからのオブジェクトのクリアに関する一般的なアドバイスはすばらしいでしょう!!!私はそのような深さでFlash Playerを分析する必要はなかった。

解決済み:私はそれがサウンドドライバとの間違いだと思っています。私のマシン上ではWindows XPでうまく動作しますが、タッチパッド上ではアプリケーションがWindows 7でクラッシュしていません。

更新:今私はそのドライバではなく、3つの異なるバージョンを試してみましたが、改善の余地はありません。私は、TweenLiteライブラリでサウンドがフェードアウトしていることを発見しました。他のマシンでうまく動作するので、TweenLiteにメモリリークがあるように見えません。 volumeEasingFunctionを使用するだけで、CPUが枯渇するまでCPUの消費量が増加するようです。それは助けにならないWindows 7を実行しているハードなハードウェアです。

答えて

2

最初に気になるのは、イベントリスナーで弱参照パラメータをtrueに設定する必要があることです。それはあなたの例ではので、5番目のパラメータである:

this.meaModel.addEventListener(ScreenChangeEvent.SCREEN_CHANGE, electedScreenChangeHandler, false, 0, true); 

グラントスキナーは、おそらくあなたは何を探すべきかの良いアイデアを得るのを助けるでしょうAS3 Resource Managementに大きな3部シリーズを持っています。弱参照リスナーの詳細は、part 3または第3部の前に書かれたstandalone articleにあります。

+0

弱い参照のコメントは+1です。今からイベントリスナーでそれを使用します – Ryan

+0

このリンクは役に立ちましたか? – Lex

関連する問題