2 Stimmen

WPF - Verbesserungen der Grafikleistung von Bildschirmschonern

Ich habe diese WPF-VS2008 Bildschirmschoner-Vorlage und begann, einen neuen Bildschirmschoner zu erstellen. Ich habe einige Erfahrung mit WinForms-Plattform (GDI +) Bildschirmschoner, so bin ich ein wenig verloren mit WPF.

  1. Das Hintergrund-Element für meinen Bildschirmschoner ist Canvas.
  2. Ein DispatcherTimer-Tick ist auf 33 msec eingestellt, was ~ 30 FPS entspricht.
  3. Background-color ist nur ein großer LinearGradientBrush.
  4. Auf dem Bildschirm habe ich (pro verfügbaren Bildschirm, auf meinem lokalen Computer habe ich 2) n-Ellipsen mit zufällig berechneten (Initialisierung) Hintergrundfarben + Alpha-Kanal gezeichnet. Sie sind alle in Canvas's Kinder Sammlung.
  5. Ich bewege diese Ellipsen auf dem Bildschirm mit einiger Logik (jeder DispatcherTimer-Tick). Ich mache eine Bewegung pro Ellipse, und dann rufen Sie einfach Canvas.SetLeft(...) und Canvas.SetTop(...) für jede Ellipse.
  6. Wenn N (Anzahl der Ellipsen) höher als 70-80 ist, fange ich an, Grafikverlangsamungen zu bemerken.

Nun frage ich mich, ob es irgendetwas gibt, was ich tun kann, um die grafische Glätte zu verbessern, wenn ich höhere N-Werte wähle? Kann ich "etwas" einfrieren, bevor ich meine Ellipsen bewege, und "etwas" wieder einfrieren, wenn ich fertig bin? Oder gibt es einen anderen Trick, den ich anwenden könnte?

Nicht, dass ich zu pingelig wäre, was die erwähnten Leistungseinbußen angeht - denn wenn N==50, funktioniert alles reibungslos, wie es sollte. Selbst wenn Ellipsen ALLE an der GLEICHEN Stelle sind (viel Transparenz), gibt es überhaupt keine Probleme.

4voto

Sean Sexton Punkte 1049

Haben Sie versucht, im CompositionTarget.Rendering-Ereignis zu rendern, anstatt in einem Timer? Ich habe in einem 3D-Bildschirmschoner eine beeindruckende Leistung erzielt, wenn ich das Rendering-Ereignis verwendet und meine eigene doppelte Pufferung vorgenommen habe. (Siehe http://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/ , http://stuff.seans.com/2008/08/24/raindrop-animation-in-wpf/ und http://stuff.seans.com/2008/09/01/writing-a-screen-saver-in-wpf/ )

0voto

John Punkte 28172

Es ist nicht möglich, ein einmal eingefrorenes Objekt wieder aufzutauen (obwohl eine Kopie des Objekts standardmäßig wieder aufgetaut wird). Doppelte Pufferung ist auch standardmäßig in WPF aktiviert, so dass Sie hier nicht gewinnen können.

Eine Möglichkeit, die Leistung zu verbessern, ist die Verwendung von Geometrieobjekte wie zum Beispiel Ellipse Geometrie als Shapes, wenn Sie nicht alle Veranstaltungen besuchen müssen, da diese leichter sind.

Ich habe auch diesen MSDN Artikel gefunden Optimierung der Leistung: 2D-Grafik und Bildbearbeitung die vorschlägt, dass ein CachingHint zusammen mit einigen anderen Tipps helfen könnte.

Vergewissern Sie sich schließlich, dass Sie das neueste Service Pack One verwenden, da es viele Leistungsverbesserungen enthält. hier skizziert

0voto

Nir Punkte 28685

Sie verbessern die Leistung, wenn Sie die Freeze-Methode bei Objekten aufrufen, die von Freezable erben - zum Beispiel Pinsel.

Der Grund dafür ist, dass Freezable zusätzliche Änderungsmeldungen unterstützt, die vom Grafiksystem verarbeitet werden müssen. Wenn Sie Freeze aufrufen, kann sich das Objekt nicht mehr ändern, so dass es keine Änderungsmeldungen mehr gibt.

Ein Beispiel für dieses Benachrichtigungssystem: Wenn Sie einen Pinsel erstellen, damit ein Rechteck malen (zum Beispiel) und dann den Pinsel wechseln, ändert sich die Farbe des Rechtecks auf dem Bildschirm.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X