1

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

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

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

4

5 に答える 5

2

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

これについてのブログ記事はこちら

于 2008-08-25T13:08:52.727 に答える
1

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

また、個々のビデオを作成している場合、VideoPlayerははるかに軽量で、クリーンアップが向上します。

于 2009-12-10T19:36:44.397 に答える
1

回答のおかげで、他のブログの質問へのリンクも役に立ちました。ガベージコレクションに関するGrant Skinnerの情報もすべて読みましたが、それらのリンクを検索して戻って、GCについて最初に言ったことを読み直すと役に立ちました。古いnogginを更新します。その単一のFLVPlaybackコンポーネントを無効にして再インスタンス化することに加えて、ローダーインスタンスを正しくアンロードおよび破棄していないことにも気付いたので、それらをクリーンアップして、プログラムがはるかに効率的に実行されるようになりました。このサイトのメモリ使用量は約90%向上したと思います。

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

@grapefrukt私はフラッシュコンポーネントを嫌っています。それらは通常、節約された時間よりも多くの悲しみを引き起こしますが、この場合、ビデオファイルで多くのキューポイントとナビゲーションが行われ、FLVPlaybackコンポーネントが私が見つけた最良のソリューションでした。もちろん、私はまだActionScriptの世界にかなり慣れていないので、おそらく何かを見落としていました

また、両方とも役に立ったので、両方の回答に賛成するという評判があればいいのにと思います... c'est la vie

于 2008-08-25T16:09:02.777 に答える
1

You can't help the memory problems much until Flash adds destructors and explicit object deletion, unfortunately. See this thread:

Unloading a ByteArray in Actionscript 3

There's a limit to how much memory Flash applets can use; the GC seems to fire upon reaching that limit. I've seen my memory-easy applets use as much as ~200MB, just because they run for hours on end and the GC doesn't want to kick in.

Oh, and I don't think using a single instance is an elegant solution, either. Currently I just write a dispose() function for my custom classes, waiting for some day when it can be turned into a proper destructor.

于 2008-08-25T11:52:04.143 に答える
0

Unfortuantely, thats just the way flash handles it. Not particularly smart, but it works for most people.

于 2008-08-25T11:54:49.270 に答える