1

今日、非常に奇妙なことを調査しているときに、このトピックに出くわしました。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 を待ちます。これが届いたら応募完了ではないでしょうか?

4

3 に答える 3

4

Flexは、Flexコンポーネントの「段階的インスタンス化」中にフレームレートを1000に設定します。これは、flexswfの初期ロード中にのみ発生します。これにより、すべてのコンポーネントを非常に迅速に構築できます。

Flexアプリが完全に読み込まれ、構築されるのを待っていますか?Flexコンテンツを操作する前に、FlexEvent.CREATION_COMPLETEを待つ必要があります。

これが発生する場所への参照が必要な場合は、プロパティusePhasedInstantiationのセッターでFlex LayoutManagerクラスの326行目(Flex SDK 3.0.194161を使用)を確認してください。

アップデート:

APPLICATION_COMPLETEは、初期ロードをカバーする必要があります。

これは、コンポーネントがMXMLから直接作成されるときに実際に発生します。したがって、探すべき他のいくつかのケースがあります。リピーターを使用していますか?オンデマンドで子供を構築しているナビゲーションコンテナを使用していますか?

于 2008-09-29T11:17:22.870 に答える
1

説明をありがとう。ロードされたアニメーション付きのクリップ(フレームアニメーションを意味すると思います)が高速化している場合、他のことが起こっているのではなく、何かが再生フレームレートを変更しているように聞こえます。そうは言っても、これまでに見た問題ではありませんが、問題のある場所を絞り込むために試すことができることがいくつかあると思います。

  1. stage.frameRateスピードアップ中にトレースアウトしてみてください。おそらく、フレームレートを変更するものは何もないはずですが、それが問題を説明するので、除外したほうがよいでしょう。

  2. できるだけ多くのGUIコンポーネントを削除し、それがなくても問題を引き起こす可能性がある場合は、問題が引き続き発生するかどうかを確認してください。

  3. 可能であれば、試すことができる健全性チェックの1つは、ゲームのコンテンツの一部を新しいプロジェクトにコピーして、そこで試すことです。一部のクラスまたはSWCが、誰もが忘れていた場所にインポートされているために、このような不思議な問題が発生することがあります。

  4. 別のイベントからコードを駆動してみることができます。たとえば、私が知っている限り、それを運転するEvent.EXIT_FRAMEEvent.FRAME_CONSTRUCTED、同じように見えるはずですが、そうでない場合は、それはヒントです。または、キーボードイベントなどからドライブしてみることもできますMouseEvent.MOUSE_MOVE。次に、イベントを発生させていなくても更新が発生した場合は、イベントループ以外の何かが何かを推進していることがわかります。

とにかく、それらは私が試みることです。あなたがそれを追跡することを願っています...

于 2008-09-27T15:36:28.253 に答える
1

私がはっきりしていないことの1つ-実際の画面の更新が公開されたフレームレートよりも速く発生していることがわかりますか? それとも、アニメーションの動きが速くなったのに、画面の更新は変わらないのでしょうか? (つまり、以前は 1 秒あたり 10 ピクセルで移動していましたが、現在は、画面が描画される頻度に関係なく、それよりも速く移動します。)

これを確認する簡単な方法は、コンテンツを 1 fps で公開してみることです。画面が 1 秒に 1 回再描画されているが、アニメーション化された要素がそれよりも頻繁に移動されているのか、それとも画面が実際により頻繁に更新されているのかは明らかです。

後者の場合、updateAfterEvent()コードでメソッドを使用していますか? これにより、実際の画面の更新が公開されたフレームレートよりも速くなる可能性があります。ENTER_FRAMEただし、イベントには影響しません。フレームの更新ごとに、これらのうちの 1 つだけを取得する必要があります。

invalidate()あるいは、アニメーション化しているのはスプライトなどだけですか、それとも Flex コンポーネントとして実装し、メソッドや RENDER イベントなどで再描画しようとしていますか?

質問でこれらの点のいくつかを明確にすることができれば、答えはより明確になる可能性があります. ありがとう...

于 2008-09-27T08:02:44.447 に答える