4

CompositionTarget.Renderingイベントは、ゲームのメイン ループを構築するのに最適です。基本的には、vsync のレート (通常は 60 Hz) で起動します。

構成ツリー内のオブジェクトがレンダリングされる直前に発生します。Rendering イベントは、アニメーションとレイアウトがコンポジション ツリーに適用された後、指定されたイベント ハンドラーにルーティングされます。

フレームごとのアニメーションのハウツー記事で、もう少し詳しく説明しています。

イベント ハンドラー メソッドは、レイアウトが計算された後に呼び出されることに注意してください。ただし、イベント ハンドラー メソッドでレイアウトを変更できます。つまり、レンダリングの前にレイアウトがもう一度計算されます。

それに基づいて、そのハンドラー内のコードのルールは次のとおりです。

  • レイアウトの変更を避ける
  • すぐに戻る

他にどんな落とし穴がありますか?別のレイアウト パスを引き起こす、自明ではないアクションは何ですか? ハンドラー内にある時間は正確にどれくらいですか?

4

2 に答える 2

4

主な目的は、正確な規則的なタイミングが必要な、重力のような物理要素を使用するアニメーションなど、タイマーのないアニメーションを有効にすることだと思います。ただし、ゲームのグラフィックには適していません... WPF はゲーム言語ではなく、オーバーヘッドが多すぎるため、本格的なゲームはスムーズに実行されません。.NET ゲームを作成する場合は、XNAを使用します。

「WPF Control Development Unleashed: Building Advanced User Experiences」という本から:

一部の読者は、このアプローチと DirectX などのハイエンド グラフィックス サブシステムとの類似点に気付くかもしれません。CompositionTarget.Rendering を、WPF ベースのゲーム グラフィック エンジンを作成するための適切な注入ポイントと間違えないでください。ハイエンド グラフィックスと超高フレーム レートは、WPF アニメーションのこの特定の側面の目標ではありません。

DispatcherTimer アプローチと同様に、CompositionTarget.Rendering に基づくアニメーションも時間制限がありません。ただし、これらのイベントはレンダリング スレッドと同期されるため、DispatcherTimer よりもアニメーションがスムーズになります。また、タイマーを開始および停止する必要はありませんが、パフォーマンスを向上させるためにイベント ハンドラーをデタッチおよびアタッチする必要がある場合があります。

于 2013-08-21T10:33:56.703 に答える
1

何か他のことを研究しているときに、私はこのアドバイスに出くわしました:

次のいずれかのアクションが発生すると、レイアウト パス プロセスが再度呼び出されます。

  • 子オブジェクトがコレクションに追加されます。
  • LayoutTransform が子オブジェクトに適用されます。
  • 子オブジェクトに対して UpdateLayout メソッドが呼び出されます。メジャーパスまたはアレンジパスに影響を与えるメタデータでマークされている依存関係プロパティの値に変更が発生した場合。

[..]

RenderTransform を置き換えるのではなく更新する

RenderTransform プロパティの値として置き換えるのではなく、Transform を更新できる場合があります。これは、アニメーションを含むシナリオで特に当てはまります。既存の Transform を更新することで、不要なレイアウト計算を開始することを回避できます。

于 2016-02-01T10:58:15.153 に答える