2009-02-25 5 views
1

キャンバスの翻訳(移動)を試みましたが、タイマーに問題があります。WPF:キャンバスを変換(移動)するベスト(信頼できる)方法とモニタすべてのステップ

私は2種類の方法を試みた:

第一の方法は、BeginAnimation機能していました、そしてDispatcherTimerティックと第二、彼らは両方とも非常に信頼性がないです。

私は翻訳のすべてのステップを監視する必要があります。最初の方法(BeginAnimation)を試して、Changedイベントで衝突検出ロジックを行い、2番目の方法(DispatcherTimer)で、タイマのTickイベントで衝突検出ロジックを実行しています。

問題は両方とも非常に信頼性が低いということです。私の衝突検出ロジックでは、TranslateTransformのプロパティYのプロパティが< = 0(技術的には、すべてのステップを監視している場合は、毎回0で停止する必要があります)のキャンバスが変換を停止するはずですが、試しましたが、それが終わるとに変わります。たとえば、は時々0に、時には-1、-2、-3で、場合によっては-4で停止します。

矛盾は何ですか?なぜそれはそれが仮定されるような方法のすべてのステップを監視していないのですか?

このキャンバスをアニメーション化して、実際にすべてのステップを監視するにはどうすればよいですか?私はすべてのステップを意味しています...移動するすべてのピクセル

答えて

2

問題はすべてが時間ベースであることです。キャンバスが1ピクセル移動するたびにコールバックを取得せず、フレームがレンダリングされるたびにコールバックを取得します。システムは難しくありませんフレームを一定のレートでレンダリングする。

最終結果は、GCが中間フレームで蹴られたために次の2ピクセルが移動したときに、すべてがスムーズに移動したために1/2ピクセル移動後にコールバックを取得することがありますバックグラウンドで実行されているWordがスペルチェッカーを実行するためにいくつかのCPUサイクルを奪ったので、それは4ピクセル移動です。

これはどのように動作するのか、これを処理して衝突検出の許容範囲を広げることができます。あるいは、あなたが望むペースでオブジェクトを進めることができる「バーチャルタイムライン」で画面からシミュレーションを実行できます。画面上のアニメーションの現実を考慮することなく。

実際の航空機のシミュレーションと衝突検出を行うソフトウェアを作成しました。これは大変な労力がかかりました。アニメーション用に構築されたフレームワークは、すべての作業高品質のシミュレーションのために行うべきであり、正確な衝突検出ではない。

0

イベントには、CompositionTarget.Renderingを接続する必要があります。

このイベントにフックすると、フレームがフレームにレンダリングされるたびに起動されるため、最後のイベントコールからの経過時間に応じてスプライトを移動できます。スプライトの動きが止まったら、イベントにフックされたイベントがあれば、WPFはフレームをできるだけ速くレンダリングするので、イベントからフックを解除する必要があります。

イベントとその使用方法の詳細については、blogの詳細を参照してください。このエントリには、ダウンロードすることができます。

関連する問題