2012-04-12 4 views
0

Ich habe eine WPF-App, die einen Kompass zeichnet. Es gibt einen großen Ring mit Häkchen und Etiketten. Ich habe eine Checkbox, die die Kompassgrafik ein- und ausschaltet. Wenn ich die App zum ersten Mal starte, schaltet sich der Kompass sofort ein und aus.Warum dauert es länger, Grafiken zu wechseln, nachdem eine Auswahl aus einem Kombinationsfeld getroffen wurde?

In der Zwischenzeit habe ich eine Combo-Box, die einige Daten aus einer lokalen Datenbank ergreift und diese verwendet, um einige Overlay-Grafiken zu rendern. Nach Verwendung dieses Kombinationsfelds schalten die Kompassgrafiken nicht mehr schnell um. Tatsächlich friert die Benutzeroberfläche für etwa 4 Sekunden vollständig ein, wenn ich auf das Kontrollkästchen klicke.

Ich habe versucht, meine App mit Window Performance Profiling Tool für WPF zu profilieren. Als ich das Kontrollkästchen aktivierte, erstarrte nicht nur meine App, sondern auch der Profiler. Die Graphiken "fingen" danach auf, aber das sagt mir, dass etwas sehr falsch sein muss.

Ich habe festgestellt, dass das Problem Grafiken sind die Teilstriche (nicht die numerischen Bezeichnungen). Wenn ich sie beseitige, hört das Gefrierproblem auf. Wenn ich sie von 360 auf 36 zähle, friert die App immer noch ein, aber für weniger Zeit. Egal wie viele Häkchen ich habe, sie schalten sich sofort um, wenn die App startet.

Meine Frage ist, Wie finde ich heraus, warum der Schalter für meine Kompass-Grafiken von Instant zu schrecklich langsam geht? Ich habe umfangreiche Profilerstellung und Debugging ausprobiert, und ich kann einfach keinen Grund finden, warum das Setzen der Sichtbarkeit auf einige Häkchen jemals dazu führen sollte, dass die App einfriert.

bearbeiten

Okay, ich habe alles aus meiner app nur das Nötigste beraubt haben, den Reißverschluss auf und lud es auf Sendspace. Hier ist der Link (es ist etwa 143K):

http://www.sendspace.com/file/n1u3yg

[. Hinweis: nicht versehentlich das Banner klicken, wird der reale Download-Link ist viel kleiner und niedriger auf der Seite]

Zwei Anfragen:

  1. Sie tritt das Problem auf Ihrem Computer? Versuchen Sie, Compass.exe (in bin \ Release) zu öffnen und schnell auf das Kontrollkästchen zu klicken. Die Kompass-Markierungen sollten ohne Verzögerung ein- und ausgeschaltet werden. Wählen Sie dann ein Element aus dem Kombinationsfeld und versuchen Sie, das Kontrollkästchen erneut zu aktivieren. Auf meinem Rechner ist es sehr lückig, und nachdem ich das schnelle Klicken gestoppt habe, dauert es ein paar Sekunden, bis die Grafik aufholt.

  2. Wenn Sie die Verzögerung erfahren, sehen Sie irgendetwas im Code, der dieses seltsame Verhalten verursachen könnte? Das Kombinationsfeld ist mit nichts verbunden. Warum sollte die Auswahl eines Elements die zukünftige Leistung anderer Grafiken im Fenster beeinträchtigen?

+0

Ich denke, Sie sollten Code hochladen, wenn Sie eine Antwort wollen –

+1

aber haben Sie nicht die Perfomance Flaschenhals gefunden? – Tigran

+0

@Tigran, nur irgendwie. Ich weiß, dass die Tick-Markierungen ein Flaschenhals sind, aber ich weiß nicht, warum sie manchmal kein Flaschenhals sind. Was ich herausfinden möchte, ist, unter welchen Bedingungen sie ein Problem werden. – devuxer

Antwort

3

Obwohl ANTS keine besondere Leistung ‚Hotspot‘ angegeben hätte, denke ich, dass Ihre Technik etwas fehlerhaft ist, wie es scheint, dass jede Zecke ein ViewModel hat, die für den Umgang mit einer individuellen Zecke verantwortlich ist, und Sie sind individuell Bindung dieser Ticks an die Ansicht. Sie erstellen dann 720 Ansichtsmodelle für diese Ticks, die jedes Mal, wenn der gesamte Kompass ein- oder ausgeblendet wird, ein ähnliches Ereignis auslösen. Sie erstellen außerdem jedes Mal, wenn auf dieses Feld zugegriffen wird, eine neue LineGeometry.

Der empfohlene Ansatz für WPF in einer benutzerdefinierten Situation wie diesem besteht darin, eine DrawingVisual zu verwenden und den beibehaltenen Modusaspekt des Renderingsystems von WPF zu berücksichtigen. Es gibt mehrere googlefähige Ressourcen, die über diese Technik sprechen, aber das Wesentliche besteht darin, eine Kompassklasse zu erben, die von FrameworkElement erbt, und einige kleinere Klassen, die von DrawingVisual erben und diese zum Rendern des Kompasses verwenden. Mit dieser Technik können Sie immer noch ein ViewModel verwenden, um das Verhalten des Kompasses zu steuern, aber Sie haben keine individuellen Ansichtsmodelle für jeden Teil des Kompasses. Ich würde geneigt sein, den Kompass in Teile wie Blende, Pfeil, Sicht usw. zu zerlegen ... aber Ihr Problem könnte einen anderen Ansatz erfordern.

+0

Hallo Ritch. +1 und danke, dass du dir die Zeit genommen hast, mein Code-Beispiel anzusehen und deine Antwort zu schreiben. Ich habe ein paar Fragen/Kommentare. Erstens, ich scheine nur 360-Ansichten-Modelle zu erstellen, nicht 720. Zumindest habe ich überprüft, dass der Konstruktor nur 360 Mal aufgerufen wird. Können Sie erklären, wo Sie 720-Ansicht Modelle sehen? Zweitens dachte ich, ich hätte * nicht * jedes Mal eine neue Liniengeometrie erstellt, sondern nur das erste Mal, wenn die Ticks gezeichnet wurden. In der Tat, wenn ich einen Unterbrechungspunkt in der 'öffentlichen Geometrie Geometrie'-Eigenschaft Getter setze, wird es nur einmal für die gesamte Lebensdauer der App getroffen. – devuxer

+0

(Fortsetzung) Schließlich, während Ihre Antwort das Problem, das ich insgesamt habe, sehr gut umgehen kann, beantwortet sie nicht direkt meine Frage, nämlich: Erleben Sie eine Verlangsamung * nur * nach der Auswahl eines Elements aus der Dropdown-Liste und wenn ja, warum? Selbst wenn ich VisualHost und DrawingVisual verwenden sollte (und ich werde definitiv in diese Technik wechseln), warum wird die Performance dann langsam, wenn man eine scheinbar nicht verwandte Combobox manipuliert? – devuxer

+0

Follow-up: Ich habe gerade versucht, den Code so zu behalten, wie es ist, außer die ganze CompassLayer und nicht die einzelnen Teilstriche umzuschalten. Dies scheint jede spürbare Verzögerung nach der Verwendung des Kombinationsfelds zu beseitigen. Ich kann die Rolle der Kombinationsbox jedoch immer noch nicht erklären. – devuxer

Verwandte Themen