2008-08-22 9 views
1

私のウェブサイトは完全にフラッシュベースです。私はFLVファイルに変換したビデオの塊として私に与えられた3Dモデルの周りを移動します。私はFLVPlaybackコンポーネントを使って自分のプログラム内のビデオをコントロールしています。 System.totalMemoryを使用してメモリチェックを実行している間、私はビデオが読み込まれるたびにメモリの塊を消費し、すべてのイベントリスナを削除しても(弱く参照されている)その親は、ビデオを停止し、コンポーネントインスタンスをnullにしても、それはそのメモリを返すことはありません。FLVPlaybackコンポーネントのメモリの問題

私はこのプロジェクトで作業を開始して以来、ユーザーがインスタンス化して読み込む可能性がある膨大な量のビデオがあるため、これは苦労しています。現在のところ、すべてのビデオが必要なときにいつでも新しいFLVPlaybackインスタンスにロードされますが、この問題についての最良の方法は、単にグローバルFLVPlaybackインスタンスを持ち、新しいビデオを古いインスタンスにリロードすることですアプリケーションのメモリには1つのFLVPlaybackコンポーネントしか存在しません。

誰もこの問題に遭遇しましたか?新しいビデオごとに再利用するグローバルインスタンスを使用するよりも優れたソリューションを見つけましたか?

答えて

1

残念なことに、Flashがデストラクタと明示的なオブジェクトの削除を追加するまで、メモリの問題を助けることはできません。このスレッドを参照してください。

Unloading a ByteArray in Actionscript 3

フラッシュアプ​​レットを使用することができますどのくらいのメモリには限界があります。 GCはその限界に達すると発火するようです。私は私の記憶が簡単なアプレットが〜200MBものものを使用しているのを見てきました。なぜなら、何時間も実行してGCがキックしたくないからです。

ああ、インスタンスもどちらかといえば洗練されたソリューションです。現在、カスタムクラスのdispose()関数を作成して、適切なデストラクタに変換できる日を待っています。

0

残念ながら、それはフラッシュがそれを処理する方法です。特にスマートではありませんが、ほとんどの人に有効です。

2

私はコンポーネントを本当に好きだったことはありません。彼らは少しばかげています。この特定の問題はよくあるようですが、やや厄介な解決策は、あなたが示唆しているように、1つのFLVPlaybackしか持たずに再利用することです。

Here's a blog post about it

1

応答のおかげで、他のブログの質問へのリンクは、私があまりにもガベージコレクションのグラントスキナーの情報のすべてを読んでいた、としても有用であったが、これらのリンクを検索して戻ってと再彼がもともとGCについて語ったことを読んで、古いノギンのリフレッシュを助けました。その単一のFLVPlaybackコンポーネントをヌル化して再インスタンス化することに加えて、私はローダーインスタンスを正しくアンロードして破棄していないことに気付きましたので、それらをクリーンアップして、今プログラムをより効率的に実行しています。私はメモリ使用量がサイトで約90%改善されたと言います。

@aib私は、単一インスタンスのソリューションがエレガントではないことを認めますが、フラッシュはそれらのFLVファイルを放棄しないため、私はそれに固執しています。

@grapefrukt私はフラッシュコンポーネントを嫌いますが、典型的には時間を節約するよりも悲しみが増えますが、この場合はビデオファイルで多くのキューポイントとナビゲーションが行われ、FLVPlaybackコンポーネントがベストソリューション見つかりました。もちろん、私はまだアクションスクリプトの世界ではまだかなり新しいので、おそらく私は何かを見ているかもしれません。

私はあなたの答えを両方とも助けてくれたので評判が上がったといいです... c'est la vie

1

多くのテストの後で私が収集したことは、必要に応じてフラッシュがライブラリやコンポーネントに動的にロードされますが、そのデータをガベージコレクションすることはありません。たとえば、FLVPlaybackコンポーネントを使用するWebアプリケーションまたはAirアプリケーションがある場合、新しいFLVPlayback()インスタンスが作成されるまで、実際のコンポーネントおよびライブラリはロードされません。それはライブラリとコンポーネントをメモリにロードしますが、プログラムやWebサイトが閉じられるまで、そのスペースを戻すことはありません。その内部のビデオを含む特定のインスタンスは、リスナーを削除してステージから外し、nullに設定する限り、ガベージコレクションを取得し、メモリを解放します。

また、個々の動画を再生している場合、VideoPlayerの方がはるかに軽量で、きれいになります。