2009-06-30 16 views
6

Silverlightで時間/フレームに基づいてオブジェクトをアニメートしようとすると(たとえば、高速アニメーションのゲームには適していないDoubleAnimationやStoryboardなどと違って)、たとえば特定の方向に宇宙船を移動する動きが激しく、滑らかではありません。画面が裂けているように見えます。Silverlightアニメーションがスムーズでない

CompositionTargetとDistpatcherTimerの間に違いはないようです。 私は(擬似コードで)次のようなアプローチを使用します。

Register Handler to Tick-Event of a DispatcherTimer 
In each Tick: 
Compute the elapsed time from the last frame in milliseconds 
Object.X += movementSpeed * ellapsedMilliseconds 

これは右、滑らかな動きになるでしょうか?しかし、それはしません。 例(コントロール:WASDとマウス):Silverlight Gameです。 このサンプルで説明した効果はあまり一般的ではありませんが、カンバス上で単一の矩形を動かすとぎこちないアニメーションが作成されることが保証されます。

これを最小限に抑える方法がありますか?これを解決できるStoryboards/DoubleAnimationsを使用して、フレームベースのアニメーションを実行する他の方法はありますか?

編集:ここでは、迅速かつ汚いアプローチ、最小のコードで矩形をアニメーション(対照:AおよびD)Animation Sample

XAML:

<Grid x:Name="LayoutRoot" Background="Black"> 
    <Canvas Width="1000" Height="400" Background="Blue"> 
     <Rectangle x:Name="rect" Width="48" Height="48" 
        Fill="White" 
        Canvas.Top="200" 
        Canvas.Left="0"/> 
    </Canvas> 
</Grid> 

C番号:

private bool isLeft = false; 
    private bool isRight = false; 
    private DispatcherTimer timer = new DispatcherTimer(); 
    private double lastUpdate; 

    public Page() 
    { 
     InitializeComponent(); 

     timer.Interval = TimeSpan.FromMilliseconds(1); 
     timer.Tick += OnTick; 

     lastUpdate = Environment.TickCount; 
     timer.Start(); 
    } 

    private void OnTick(object sender, EventArgs e) 
    { 
     double diff = Environment.TickCount - lastUpdate; 

     double x = Canvas.GetLeft(rect); 

     if (isRight) 
      x += 1 * diff; 
     else if (isLeft) 
      x -= 1 * diff; 

     Canvas.SetLeft(rect, x); 

     lastUpdate = Environment.TickCount; 
    } 

    private void UserControl_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.D) 
      isRight = true; 

     if (e.Key == Key.A) 
      isLeft = true; 
    } 

    private void UserControl_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.D) 
      isRight = false; 

     if (e.Key == Key.A) 
      isLeft = false; 
    } 

おかげ! Andrej

+1

+1私は、吃音、裂け、ちらつきのために、ゲームをSilverlight 3で作成しようとしました... 4でこれを解決したのか、それとも滑らかなアニメーションのためにPowerpointほど役に立たないのだろうか? AMOSの20歳以上の私のアミーガは、この部門のより優れたパフォーマーであり、より簡単な開発プラットフォームです) –

+0

私は最近同様の質問をしました。私はそれが私のハードウェアと関係があると思った:MacBookデュアルブート(ブートキャンプ)、私は私が持っている他のすべてのWindows PCで同じ問題を抱えていた。私が右にマークした答えは実際に問題を解決しなかったことに注意してください...私はストーリーボードが単純な長方形を動かす場合でもこの問題を観察しました。私はこれがすぐに修正されることを願っていますhttp://stackoverflow.com/questions/5319562/silverlight-fast-moving-bitmap-does-not-update-smoothly –

答えて

3

1ミリ秒ごとに位置を更新すると、銀色の画面が速い画面を更新しないため、過剰な操作になります。そのようなオブジェクトの位置を変更すると、Silverlightはフレームバッファをダーティとマークし、最終的に画面を再描画しますが、MaxFrameRateより頻繁に画面を再描画しません。

はちょうど MaxFrameRate設定するには:

Application.Current.Host.Settings.MaxFrameRate = 60; 

これは十分すぎるほどであるべきである毎秒60のフレームのアプリケーションを制限します。

関連する問題