AS3 でリモート プレゼンテーション ツールを構築しています。簡単に言えば、1 人のユーザー (発表者) がプレゼンテーションの各スライドへのリンクを含む「目次」HTML ページにアクセスでき、任意の数の視聴者が別のページでプレゼンテーションを見ることができます。サーバーを毎秒ポーリングして正しいスライドにあることを確認する SWF の形式。管理者が TOC のスライド リンクをクリックするたびに、データベースが更新され、次の要求でプレゼンテーション swf は、現在表示されているスライドのラベルと、サーバーから取得した応答を比較します。応答が現在のラベルと異なる場合、swf は正しいフレーム ラベルが見つかるまでタイムラインをスクラブします。それ以外の場合は何もせず、次のポーリング結果 (1 秒後) を待ちます。
各スライドは、スライドが表示されている限りループする独自のネストされたタイムラインを持つムービークリップで構成されます。ネストされたムービークリップを制御するアクション スクリプトはありません。また、stop();
各キーフレームの を除いて、メイン タイムラインにアクション スクリプトもありません (それぞれがプレゼンテーションのスライドです)。
すべてが構築され、完璧に機能しています。唯一の問題は、プレゼンテーション SWF が長時間 (たとえば 20 分) 開いていると、特定のスライドでアニメーション化されているムービークリップのフレームレートにポーリングが顕著な影響を及ぼし始めることです。つまり、毎秒、約 10 分の 3 秒持続するアニメーションのフレームレートが著しく低下します。
AS3 にはメモリ管理の問題があることを知っており、オブジェクトとイベント リスナーの再利用に熱心に取り組んできました。コード自体は非常に単純です。Timer
毎秒起動するインスタンスがあり、これnew URLRequest
により によってロードされる がトリガーされURLLoader
ます。はURLLoader
呼び出しごとに再利用されますが、URLRequest
はそうではありません ( への呼び出しから取得された新しいキャッシュ削除値で毎回初期化する必要がありますnew Date().time
)。クラス全体でインスタンス化された唯一のオブジェクトは、Timer
、URLLoader
、さまざまなURLRequests
(ガベージ コレクションする必要がある) であり、唯一のイベント リスナーはTimer
(一度追加された) にあります。URLLoader
(一度追加された)、および適切なスライドを見つけるためにタイムラインを前後にスクラブするルーチンについて (正しいスライドが見つかると削除されます)。
私はmr doob の統計パッケージを使用してメモリ使用量を監視してきましたが、これは時間の経過とともに確実に増加するため、どこかにリークがあるはずです (スクラブと約 25 分間の稼働時間の後に、最初の ~30 MB から > 200 MB に増加します)。
パフォーマンスの問題を引き起こしている可能性のあるものについて、誰か考えがありますか?
更新:パフォーマンスの問題がメモリに直接関係しているのかどうかは完全にはわかりません。プレゼンテーション swf のインスタンスを約 15 分間実行したところ、メモリ使用量は約 70 MB までしか上昇しませんでしたが (そしてそこにとどまりました)、1 秒間隔で顕著な問題が発生し始め、ポーリング呼び出しと一致しました (Firebug の Net パネルで追跡)。 )。ムービークリップが途切れるその他の原因は何ですか?