2013-01-28 3 views
0

Я пытаюсь переместить красную линию (без заикания) по экрану, и я пробовал всевозможные подходы. Из GDI + двойной буферизации (с использованием класса BufferedGraphics) в WPF WriteableBitmap, и все не удалось. Может быть, таймеры, использующие их, недостаточно точны, это может v-sync разрывать, но это просто кажется невозможным. Сейчас мы в 2013 году, и у меня есть high-end графический процессор, и я все еще не способен воспроизвести то, с чем не сталкивались мои старые 8-битные SNES.Проведите линию плавно по экрану

У кого-нибудь есть пример кода WinForms, который на 100% гладкий и без мерцания, или это просто миссия невозможна без DirectX?

+0

Как быстро он будет двигаться? – Clemens

+0

При 32 Гц, 32 пикселя в секунду – Muis

ответ

0

В WPF вы можете просто анимировать линейный контроль.

<Canvas> 
    <Line x:Name="line" 
     X2="{Binding X1, RelativeSource={RelativeSource Mode=Self}}" 
     Y2="{Binding ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}}" Stroke="Red" StrokeThickness="4"> 
    </Line> 
</Canvas> 

Вы бы создать и запустить анимацию с помощью метода, как это:

private void StartAnimation() 
{ 
    var animation = new DoubleAnimation 
    { 
     To = ActualWidth, // width of the window 
     Duration = TimeSpan.FromSeconds(ActualWidth/32), 
     RepeatBehavior = RepeatBehavior.Forever 
    }; 

    line.BeginAnimation(Line.X1Property, animation); 
} 

Вместо того, чтобы анимировать X1 свойство линии и пусть последующие X2 свойства путем связывания, вы могли бы также анимировать RenderTransform линии:

<Canvas> 
    <Line Y2="{Binding ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}}" Stroke="Red" StrokeThickness="4"> 
     <Line.RenderTransform> 
      <TranslateTransform x:Name="transform"/> 
     </Line.RenderTransform> 
    </Line> 
</Canvas> 

Метод StartAnimation теперь будет выглядеть так:

private void StartAnimation() 
{ 
    var animation = new DoubleAnimation 
    { 
     To = ActualWidth, // width of the window 
     Duration = TimeSpan.FromSeconds(ActualWidth/32), 
     RepeatBehavior = RepeatBehavior.Forever 
    }; 

    transform.BeginAnimation(TranslateTransform.XProperty, animation); 
} 
Смежные вопросы