WPF: Verbesserte Leistung für das Ausführen auf älteren PCs

9

Also, ich baue eine WPF-App und habe heute eine Test-Deployment durchgeführt und festgestellt, dass sie ziemlich schlecht funktioniert. Ich war überrascht, da wir nicht wirklich an visuellen Effekten oder Animationen arbeiten.

Ich habe es auf zwei Rechnern installiert: Der schnellste und der langsamste, der die Anwendung ausführen muss (der langsamste PC hat einen Intel Celeron 1,80 GHz mit 2 GB RAM). Die Anwendung lief auf der schnelleren Maschine ziemlich gut, war aber auf der langsameren Maschine abgehackt. Und wenn ich "abgehackt" sage, bedeutet das, dass der Cursor gesprungen ist, obwohl er gerade über jedes offene Fenster der App, die den Fokus hatte, gesendet wurde.

Ich habe das Fenster "Task-Manager-Leistung" geöffnet und konnte feststellen, dass die CPU-Auslastung sprang, wenn die App den Fokus hatte und der Cursor sich darüber bewegte. Wenn ich einem anderen (z. B. Excel) den Fokus gab, ging die CPU-Nutzung nach einer Sekunde zurück. Dies passierte auf beiden Maschinen, aber der Hacking war nur auf der langsameren Maschine bemerkbar. Ich hatte nur sehr begrenzte Zeit, um an den Deployment-Maschinen herumzubasteln, also habe ich nicht viele detaillierte Tests gemacht.

Die App läuft auf meinem Entwicklungscomputer gut, aber ich sehe auch, dass die CPU dort bis zu 10% hochschießt, indem Sie einfach den Cursor über das Fenster bewegen.

Ich habe das WPF-Performance-Tool von MS heruntergeladen und daran herumgebastelt (auf meinem Dev-Rechner). Die Dokumentation sagt dies über die Metrik "Frame Rate" im Perforator Tool:

  

Für Anwendungen ohne Animation,   Dieser Wert sollte nahe 0 liegen.

Die App macht keine starke Animation, aber die Bildrate bleibt nahe 50, wenn sich der Cursor über einem Fenster befindet. Die Bildschirme, auf denen ich getestet habe, haben Spaltenüberschriften in einem Raster, die "hervorgehoben" sind, und Schaltflächen, die Farbe und Aussehen ändern, wenn sie gescrollt werden. Wenn Sie die Maus auf leere Bereiche der Fenster bewegen, werden die gleiche Bildrate und CPU-Auslastung angezeigt (scheint nicht mit diesen kleineren Animationen zusammen zu hängen).

(Ich bin auch nicht in der Lage, herauszufinden, wie man nur die beiden Standardwerkzeuge Perforator und Visual Profiler in das WPF-Leistungstool installieren kann. Das ist wahrscheinlich eine separate Frage).

Ich habe auch Redgates Profiling-Tool, aber ich bin mir nicht sicher, ob das die Renderleistung beleuchten kann.

Also, ich weiß, das ist keine einfache Sache, um Fehler zu beheben, ohne Details oder Beispielcode (die ich nicht veröffentlichen kann). Meine Fragen sind:

  • Was sind allgemeine Dinge zu sehen? für (oder zu vermeiden) im Code zu verbessern Leistung?
  • Welche Schritte kann ich mit dem WPF durchführen? Performance-Tool zur Eingrenzung der Problem?
  • Ist die oben aufgelistete PC-Spezifikation (Intel Celeron 1,80 GHz mit 2 GB RAM) zu langsam, um selbst WPF-Anwendungen aus dem Vollen laufen zu lassen?
Phil Sandler 23.04.2010, 13:33
quelle

2 Antworten

3

Wenden Sie BitmapEffect -s auf Ihre UI-Elemente an? Sie werden nicht von der GPU verarbeitet, daher kümmert sich die CPU darum, sie zu rendern. Wenn sie nicht ordnungsgemäß verwendet werden (z. B. wenn ein OuterGlowBitmapEffect auf ein großes komplexes Element angewendet wird), können sie die Leistung erheblich beeinträchtigen.

Sie sollten auch weiterhin versuchen, Ihre App mit einem Leistungsprofiler zu profilieren. Nur um zu sehen, ob das nicht Ihr Code ist.

    
arconaut 24.04.2010 15:28
quelle
0

Das ist nicht normal für WPF - ich vermute, dass einer Ihrer Entwickler Code geschrieben hat, der einen Timer im Hintergrund ausführt (oder eher eine Beschreibung, einen Mausbewegungs-Handler), der die Benutzeroberfläche in irgendeiner Weise beeinflusst.

Wenn Sie ANTS-Leistungsprofiler haben (das ist wirklich nett), würde ich das über Ihre App laufen lassen und das Problem reproduzieren.

Sobald Sie das getan haben, sollte ANTS Ihnen ziemlich schnell sagen, was das Problem ist. Wenn ANTS überhaupt nichts enthüllt und Ihnen zeigt, dass während dieser Zeit tatsächlich keiner Ihrer Code läuft, würde ich fehlerhafte Grafikkartentreiber vermuten.

Sie können dies testen, indem Sie die Hardwarebeschleunigung deaktivieren, indem Sie den folgenden Registrierungsschlüssel festlegen und es erneut versuchen:

%Vor%

Hinweis: Der DisableHWAcceleration -Wert sollte ein DWORD

sein     
Orion Edwards 25.11.2010 19:32
quelle