Benutzer mit den meisten Antworten
Animation beschleunigen?

Frage
-
Hallo,
meine Applikation soll beschleunigt werden und sparsamer mit Speicher umgehen.
Ich zeichne über ein Hintergrundimage eine DrawLine und mache danach Restore um das ständig zu refreshen.
Es entsteht eine akzeptable Animation.
Auf langsamen Rechner´n hab ich allerdings Perfomance-Probleme.
Wie kann ich das besser lösen?
Danke Michael
Antworten
-
aber ich glaub das paßt nicht zu meinem Problem.
this.panel1.BackgroundImage = global::AnimationSchnell.Properties.Resources.RobotikBeladePuffer_Front;
Ich lade also als erstes ein Image, über dam ich die Animation laufen lasse.
Hallo Michael
ich glaube eher dein Ansatz mit BackgroundImage und dem GraphicsState-Restore im OnPaint wird kaum eine optisch akzeptable Animation ergeben.
Bei einer Animation (unter Windows Forms/GDI+) ist einerseits das 'Flackern' ein Thema, da kann durchaus zB das von Robert genannte 'Double Buffering' helfen.
Andererseits geht es ums Timing (also eine konstante 'Frame Rate' / fps), auf Rechnern mit sehr verschiedener Performance (CPU, und auch Grafikkarte/Treiber), uU sogar je nach Monitor-Bildfrequenz.
Du wirst vermutlich nicht herumkommen dich in die Thematik einzuarbeiten.
Einige weitere Links, keinesfalls abschliessend, da Grundlagen nicht .NET-spezifisch:
http://stackoverflow.com/questions/188349/simple-animation-using-c-windows-forms
http://www.bobpowell.net/animation.htm
http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx
Und ggf wäre eine Lösung unter WPF hier eher von Vorteil.- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 30. September 2010 15:19
Alle Antworten
-
Hallo Michael,
Ich zeichne über ein Hintergrundimage eine DrawLine und mache danach Restore um das ständig zu refreshen.
Es entsteht eine akzeptable Animation.
Auf langsamen Rechner´n hab ich allerdings Perfomance-Probleme.
es ist sicher einfacher Dir zu helfen, wenn Du Code bereitstellst, der zeigt wie Du es bisher gelöst hast.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hier der Code ausschnittsweise:
protected override void OnPaint(PaintEventArgs pea)
{
g = Graphics.FromHwnd(panel1.Handle);
...
GraphicsState gs = g.Save();
...
g.DrawLine(myPen, -A_To_B_half * fakt, 0.0f, XAPos * fakt, YAPos * fakt);
g.DrawLine(myPen1, -A_To_B_half * fakt, 0.0f, XAPos * fakt, YAPos * fakt);
g.DrawLine(myPen, XAPos * fakt, YAPos * fakt, InterSectA1.X * fakt, InterSectA1.Y * fakt);
g.DrawLine(myPen1, XAPos * fakt, YAPos * fakt, InterSectA1.X * fakt, InterSectA1.Y * fakt);
...
g.Restore(gs);
}
-
Hallo mimuel,
Schau Dir mal die folgenden Links an. Vielleicht können sie Dir weiter helfen.
http://flylib.com/books.php?ln=en&n=2&p=72&c=126&p1=1&c1=1&c2=145&view=1 oder http://www.c-sharpcorner.com/UploadFile/dbeniwal321/1984/Default.aspx
„If the drawing operation is small and includes drawing only simple objects such as rectangle or lines, there is no need for double buffering (it may even degrade performance).“ aber „If there are many calculations or drawn elements, performance and appearance may be greatly improved through the use of double buffering.“
Grüße,
Robert
-
Hallo Robert,
vielen Dank für den Tipp, aber ich glaub das paßt nicht zu meinem Problem.
Sorry, ich hab bei dem Code eine wichtige Zeile Vergessen:
this.panel1.BackgroundImage = global::AnimationSchnell.Properties.Resources.RobotikBeladePuffer_Front;
Ich lade also als erstes ein Image, über dam ich die Animation laufen lasse.
Hast Du hierhür eine bessere Lösung.
Danke Michael
-
aber ich glaub das paßt nicht zu meinem Problem.
this.panel1.BackgroundImage = global::AnimationSchnell.Properties.Resources.RobotikBeladePuffer_Front;
Ich lade also als erstes ein Image, über dam ich die Animation laufen lasse.
Hallo Michael
ich glaube eher dein Ansatz mit BackgroundImage und dem GraphicsState-Restore im OnPaint wird kaum eine optisch akzeptable Animation ergeben.
Bei einer Animation (unter Windows Forms/GDI+) ist einerseits das 'Flackern' ein Thema, da kann durchaus zB das von Robert genannte 'Double Buffering' helfen.
Andererseits geht es ums Timing (also eine konstante 'Frame Rate' / fps), auf Rechnern mit sehr verschiedener Performance (CPU, und auch Grafikkarte/Treiber), uU sogar je nach Monitor-Bildfrequenz.
Du wirst vermutlich nicht herumkommen dich in die Thematik einzuarbeiten.
Einige weitere Links, keinesfalls abschliessend, da Grundlagen nicht .NET-spezifisch:
http://stackoverflow.com/questions/188349/simple-animation-using-c-windows-forms
http://www.bobpowell.net/animation.htm
http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx
Und ggf wäre eine Lösung unter WPF hier eher von Vorteil.- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 30. September 2010 15:19