今日、非常に奇妙なことを調査しているときに、このトピックに出くわしました。Flex アプリで特定の操作を行うと、レンダリングされるフレーム数が 12fps から最大 30fps に急増する可能性があります。ロードされたアニメーションが高速で再生され始め、GUI がロックアップし始めます。
私がFlex/Flashで読んだことはすべて、「フレームレートは最上位アプリで設定されたfpsに制限されている」という点を強調しているため、これらの余分なレンダリングが発生する唯一の方法は、それらを引き起こすいくつかのイベントによるものです(ステージのフレームレートに対するプログラムによる変更はどこでも行われません)。更新ロジックを ENTER_FRAME ハンドラーに配置した場合にのみ発生するため、何が起こっているのかを把握しようとしています。
仮説: 更新関数の何かが即時の画面更新をトリガーしています。これにより、別の ENTER_FRAME がすぐに発生します。これは、更新ループが呼び出され、別の即時の画面更新がトリガーされることを意味します...
これが要因である場合、GUI で使用される Flex コンポーネントがあります。これで次にどこに行くべきか本当にわかりません。
説明:
- 物事がスピードアップすると私が言うとき、これには 2 つの方法があります。
- まず、私の ENTER_FRAME ハンドラーがはるかに頻繁に呼び出されます。
- 次に、ループ アニメーションが組み込まれた Flash SWF をロードすると、突然速度が上がり、ばかげているように見えます。
- 私は updateAfterEvent を使用していません。この問題を調査しているときにのみ、これが存在することがわかりました。どうやら、Sprite サブクラスのいくつかのイベントは自動的にこれを呼び出しますが、それが根本的な原因なのだろうかと思います。
- 私はレンダリングを直接いじっていません。バックグラウンド アニメーションは、CS3 オーサリングからタイムラインが組み込まれているため、自動的に再生されます。更新機能は、DisPlayObjects の位置を変更したり、それらを追加/削除したりするだけです。
更新: stage.frameRate を出力するためにアプリにラベルを追加したところ、特定の時間に 12 から 1000 (最大許容値) に突然変化することがわかりました。ENTER_FRAME ハンドラーに行を追加してリセットするのは簡単でしたが、それは大きな助けにはなりません。また、これを行っても、レンダリングはすべて台無しです。特定のアクション (アラート ポップアップの表示など) によって、すべてが元に戻ります。残念ながら、setter プロパティにブレークポイントを設定するための Stage クラスのソースを表示できません。
Flex ローディングの「1000fps に設定」については非常に興味深いです。私たちが持っているのは、すべてが共通のインターフェースを提供するいくつかの Flex アプリケーションです。マスター アプリは、SWFLoader クラスを通じて必要に応じてこれらのモジュールをロードする役割を担います。ただし、読み込みプロセスでは読み込みの遅延がすでに考慮されています... SWF が読み込まれると、SystemManager からの APPLICATION_COMPLETE を待ちます。これが届いたら応募完了ではないでしょうか?