none
Simple Animation ruckelt RRS feed

  • Frage

  • Hallo,

    wir nutzen WPF häufig für animierte Anwendungen. Dabei gab es immer schon Probleme, dass die Animationen häufig etwas ruckelig ausgeführt wurden. Wir haben dazu schon zahlreiche Artikel und Diskussionen gelesen. Klar, es gibt viele Performance-Issues mit WPF, insbesondere wenn man auch noch Effekte nutzt. Kleinere Ruckler waren aber in unseren bisherigen Projekten immer verschmerzbar. Diesmal darf es aber gar nicht ruckeln.

    Es geht eigentlich darum, eine Bitmap von links nach rechts zu bewegen. Dazu animieren wir einfach die Canvas.Left-Eigenschaft. Das sollte einen modernen Rechner (und wir nutzen sogar eher sehr performante Geräte) nicht wirklich überfordern, aber es ruckelt mal wieder. Also haben wir wieder etliche Tests gemacht und schließlich ein minimales Projekt erstellt, das nicht mal eine Bitmap bewegt, sondern einfach nur ein ausgefülltes Rechteck von links nach rechts schiebt. Hier der Code:

    <Window x:Class="TestWpfAni.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="800" Width="1000" Background="Black">
    
        <Window.Resources>
            <Storyboard x:Key="StoryMain" RepeatBehavior="Forever">
                <DoubleAnimation
                    Storyboard.TargetProperty="(Canvas.Left)" Storyboard.TargetName="m_Test"
                    To="350" Duration="0:0:08">
                </DoubleAnimation>
            </Storyboard>
        </Window.Resources>
        <Window.Triggers>
            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                <BeginStoryboard Storyboard="{StaticResource StoryMain}"/>
            </EventTrigger>
        </Window.Triggers>
    
        <Canvas>
            <Rectangle
                x:Name="m_Test"
                Fill="AliceBlue"
                Canvas.Left="-400" Canvas.Top="200"
                Width="400" Height="400" />
        </Canvas>
    </Window>
    

    Auch diese Animation ruckelt. Es ist als für sie für ein paar ms stehen bleiben. Auf unterschiedlichen Rechnern sind die Ruckler unterschiedlich stark, aber man erkennt immer noch ein Ruckeln. Laut Wpfperf (Perforator) haben wir konstante 60 Frames/s. In seltenen Fällen mal 59 Frames/s. Aber einen Zusammenhang können wir nicht erkennen. Ein Anpassen der DesiredFrameRate hat uns nicht wirklich geholfen.

    Hat jemand noch Tricks oder Erklärungen zu diesem Phänomen? Könnt ihr es überhaupt nachstellen. Eine so einfach Animation sollte doch gerade noch ruckelfrei hinzubekommen sein.

    Vielen Dank

    P.

    Donnerstag, 16. August 2012 19:17

Alle Antworten

  • Hi,

    ich habe dein Projekt in VS2012 mit .NET Framework 4.5 ausprobiert und es hat nicht geruckelt. Vielleicht probiert ihr es mal damit.

    Habe aber ein wenig die Eigenschaften angeschaut. Vielleicht würde euch folgende Eigenschaft "RenderOptions.BitmapScalingMode" (LowQuality ist nur eins von mehreren Auswahlmöglichkeiten) weiterhelfen:

    <DoubleAnimation
       Storyboard.TargetProperty="(Canvas.Left)"
       Storyboard.TargetName="m_Test"
       To="350" Duration="0:0:08"
       RenderOptions.BitmapScalingMode="LowQuality">
    </DoubleAnimation>

    Viele Grüße

    Naro

    Sonntag, 19. August 2012 21:55
  • Hallo Narogar,

    ich glaube nicht, dass dies an .net 4.5 liegt. Viel mehr dürfte das wohl an popenterer Hardware liegen. Eine Leistungsfähigere Hardware macht definitiv einen Unterschied.

    Wenn ich aber "flackern" höre, fällt mir dazu nur der Begriff "DoubleBuffering" ein. Ich habe mal gegoogelt und es scheint in den WPF tatsächlich keine möglichkeit zu geben, ein Double Buffering zu aktivieren, da ja die WPF per DirectX gerendet wird und es daher nicht notwendig sei.

    ABER, es gibt wohl ein Control, dass das doppelt gepuffert werden kann: Und zwar das D3DImage. Versuch es mal damit, evtl. könnt ihr damit eur "ruckel"-Problem lösen ;-)


    Viele Grüße Holger M. Rößler


    Sonntag, 19. August 2012 22:16
  • Hallo,

    danke für eure Antworten. Wir haben hier auch Maschinen, bei denen das Ruckeln weniger auffällt, und Maschinen, bei denen es drastisch ist. Allerdings sind alle Maschinen ziemlich potent (Vierkerne, teilweise mit dedizierter Grafikkarte und teilweise mit Onboard). Und ganz ehrlich, ein farbiges Viereck auf einem schwarzen Hintergrund flüssig zu animieren, das hätte ich - Achtung, ich werde polemisch - auch auf meinem alten C64 flüssig hinbekommen. Außerdem zeigt wpfperf auch, dass es eigentlich keine Performance-Probleme gibt.

    Am Framework 4.5 liegt es auch nicht. Das hatten wir schon ausprobiert. Mehr noch, selbst mit dem angeblich so potenten WinRT (Stichwort Direct2D, aktuelle Direct3D-Version, etc.) ruckelt ein identisches Projekt.

    Wir haben es auch schon auf frisch aufgesetzten, gerade neu gekauften Maschinen (mit entsprechend aktueller Hardware) ausprobiert.

    Ich persönlich habe den Eindruck, dass die Animationen ein Timing-Problem haben und die Zwischenschritte teilweise nicht sauber berechnen, wenn sie durch irgendetwas kurz gestört werden (was auch immer das ist). Ich habe auch schon an Sachen gedacht, wie die Priorität für den Rendering-Prozesses zu erhöhen, falls das möglich wäre.

    Hat jemand noch Ideen?

    Danke

    P.

    Dienstag, 21. August 2012 08:56