質問

私の Web サイトは完全に Flash ベースで、FLV ファイルに変換したビデオの塊として提供された 3D モデル上で動きます。FLVPlayback コンポーネントを使用してプログラム内のビデオを制御しています。System.totalMemory を使用してメモリ チェックを実行しているときに、ビデオが読み込まれるたびにメモリのチャンクが消費され、そこからすべてのイベント リスナーを削除した場合でも (すべて弱参照されています)、コンポーネントがその親であるビデオを停止し、コンポーネント インスタンスを null にしても、そのメモリは返されません。

ユーザーがインスタンス化してロードできる可能性がある膨大な量のビデオのため、このプロジェクトに取り組み始めて以来、このことに悩まされてきました。現在、すべてのビデオは必要に応じて新しい FLVPlayback インスタンスにロードされますが、おそらくこの問題に対処する最善の方法は、単純にグローバル FLVPlayback インスタンスを用意し、新しいビデオを古いインスタンスにリロードすることであると読みました。アプリケーションのメモリには FLVPlayback コンポーネントが 1 つだけ存在します。

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

役に立ちましたか?

解決

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

Actionscript 3 での ByteArray のアンロード

Flash アプレットが使用できるメモリ量には制限があります。GC はその制限に達すると起動するようです。メモリを消費しやすいアプレットが、何時間も実行され続けて GC が起動したくないという理由だけで、最大 200MB を使用するのを見たことがあります。

ああ、単一のインスタンスを使用することもエレガントな解決策だとは思いません。現在、私はカスタム クラスの destroy() 関数を作成するだけで、いつか適切なデストラクターに変換できるようになるのを待っています。

他のヒント

私はコンポーネントがあまり好きではありませんでした。少し危険です。この特定の問題は一般的なようで、やや迷惑な解決策は、あなたが提案しているように、FLVPlayback を 1 つだけ用意し、それを再利用することです。

それに関するブログ投稿はこちらです

回答ありがとうございます。他のブログの質問へのリンクも役に立ちました。私はガベージ コレクションに関する Grant Skinner の情報もすべて読みましたが、それらのリンクを検索し、GC について彼が最初に述べたことを読み返してみると役に立ちました。古いノギンをリフレッシュします。その 1 つの FLVPlayback コンポーネントを null にして再インスタンス化することに加えて、Loader インスタンスを正しくアンロードおよび破棄していないことにも気づきました。そのため、それらをクリーンアップしたところ、プログラムははるかに効率的に実行されるようになりました。このサイトのメモリ使用量は約 90% 改善されたと思います。

@aib単一インスタンスのソリューションが洗練されていないことは認めますが、FlashはこれらのFLVファイルを手放さないため、私はそれにちょっと行き詰まっています。

@grapefrukt 私は Flash コンポーネントが大嫌いです。通常、フラッシュ コンポーネントは時間の節約よりも多くの悲しみを引き起こします。しかし、この場合、ビデオ ファイルで多くのキュー ポイントやナビゲーション処理が行われていたため、FLVPlayback コンポーネントが私が見つけた最良の解決策でした。もちろん、私は actionscript の世界にはまだ慣れていないので、何かを見落としているかもしれません

また、両方とも役に立ったので、両方の回答に賛成票を投じる評判があればよかったと思います...セ・ラ・ヴィ

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

また、個別のビデオを作成する場合は、VideoPlayer の方がはるかに軽量で、クリーンアップも優れています。

残念ながら、それはフラッシュがそれを処理する方法です。特別賢いわけではありませんが、ほとんどの人にとってはうまくいきます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top