0

「非動的な子」とは、プリコンパイルされた別のライブラリ シンボルの子を意味します。たとえば、ライブラリ シンボル MC_1 にインスタンス MC_2 が含まれている場合 - MC_1 は actionscript 用にエクスポートされ、MC_1 はそのインスタンス名を使用してそこからアドレス指定されます (たとえば、instance_1 とします)。 )。このシナリオでは、MC_2 は MC_1 への this.parent 参照を引き続き取得し、MC_1 を拘束してガベージ コレクターの動作を停止させますか? (MC_1 の AS3 ファイルで) removeChild(instance_1) を削除し、instance_1 を null に設定する必要がありますか? コード内で MC_2 に参照が与えられていない場合でも?

私がガベージ コレクションについて学んだこと (無駄に読んだ 20 以上の記事の中で) によると、その答えはおそらく、そのような参照を削除する必要はないということですが、私が質問するのはこれだけです。試していません。

画面が変更されるたびに、各クラス (ほとんどのクラスには独自の destructor() があります) を介して destructor() 関数をカスケードする DocumentClass current_screen 変数がゲーム内にあります (また、表示リストから current_screen を削除して null に設定します)。カスケード デストラクタは、クラスの子とそのすべてのリスナーを削除し、すべてのオブジェクト変数参照 (配列内のものを含む) を null に設定します。ただし、新しい画面が作成されるたびに (current_screen = new Screen())、メモリ使用量は着実に増加しており、ガベージ コレクションが適切に行われていないことが示唆されます (最終的に遅延が発生します)。デストラクタ クラスで他に何ができるかはわかりませんが、純粋にグラフィカルで非動的な子を完全に必死になって削除し始めることを除いては。

4

1 に答える 1

0

正直なところ、あなたの説明を理解するのに少し苦労しましたが、ガベージ コレクションに関する私の経験の一部を提供できれば幸いです。

私の経験では、Flash Builder プロファイラーを使用しています。

これまで読んだすべての記事でお気づきかもしれませんが、フラッシュで効果的なガベージ コレクションを行うための鍵は、オブジェクトが参照解除されていることを確認することです。これは、次の方法で実現されます。

  • オブジェクトの設定null
  • 他のオブジェクトがオブジェクトへの参照を保持していないことを確認します。array
  • event listenersこのオブジェクトにアタッチされているものを削除する
  • timersまたはを正しく破壊するintervals
  • tweensあなたのオブジェクトに取り組んでいるすべてのものを破壊する

上記は、問題のオブジェクト内にネストされたオブジェクトにも適用されます。

私のワークフローでは、Flash Builder を使用して、プロファイラーを実行し、特定の時点でスナップショットを作成してから、[ガベージ コレクターを実行] ボタンをクリックしました。通常はガベージ コレクションが実行されたことを証明するグラフが更新されるのを待った後、もう一度スナップショットを作成しました。

次に、これらの両方のスナップショットを見て比較すると、まだ残っているオブジェクトを確認できます。それらが存在する場合は、それらを調べて、何がそれらに保持されているかを突き止めることができます.

すべてのオブジェクトのクラスパスをフィルタリングして、作成したオブジェクトをより簡単に取得できます。必要に応じて、取得しようとしているオブジェクトに含まれていない組み込みクラスを削除できます。

徘徊オブジェクトの検索ボタンもありますが、私はそれに頼ったことはありません。

GC がいつ実行されるか (少なくともブラウザーでは制御できない) を制御できないため、GC がいつ実行されるかを保証することはできません。そのため、GC が決定したときにメモリが増加して収集される可能性がありますが、フラッシュ ビルダーでプロファイリングする場合、このアプローチを使用して、ガベージ コレクションを実行したときにオブジェクトが収集される場合、GC を許可したときにも機能することを証明できます。自分の時間でそれを処理する。

于 2012-07-06T15:24:21.213 に答える