Laden...

MouseMove , Ruckeln, Dispatcher auslastung

Erstellt von Stu42 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.544 Views
S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 12 Jahren
MouseMove , Ruckeln, Dispatcher auslastung

Hallo,

ich habe ein Fenster mit ein paar Shapes und Animationen.
Wenn ich nun die Maus im Fenster hin und her bewege, dann
fängt die Animation übelst an zu rucken.

Ich habe mir die Sache mal mit dem Performance Tool
mal genauer angeschaut. Mit ist aufgefallen, das die Dispatcher
auslastung bei Mausbewegung schnell in die höhe schießt.

Aber wie kann das sein? Ich habe überall in meinen Mausevents
Breakpoints gesetzt, bzw. auch mal alles events deaktiviert,
und Trozdem geht die Dispatcherauslastung schnell in die höhe.

Woran kann das liegen?

Grüße,
Stu

36 Beiträge seit 2006
vor 12 Jahren

Hallo Stu42,

hast du einen Ausschnitt aus deinem Quellcode, dass den Dispatcher zeigt. Oder anders, welche Einstellungen hat der Dispatcher und was genau damit gemacht wird?

Gruß
Codexzier

Nicht immer hilft Wissen weiter, manchmal muss man einfach daran glauben.

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 12 Jahren

Ich habe gar nichts mit dem Dispatcher gemacht. Aber ich schätze mal das der Dispatcher dennoch standardmäßig die Events verarbeitet.

Meine erste Vermutung war, das der Automatische HitTest zu lange dauert.
Aber dann habe ich im Hauptfenster das MouseMovePreview event abgefangen, und e.Handled = true gesetzt, damit das event nicht mehr weiterv erarbeitet wird.
Das hat aber auch nicht geholfen. Kann es sein, dass der HitTest weiterhin aktiv ist, auch wenn er abgeschaltet ist?

Edit:

Was auch komisch ist, das es zwar ruckelt, bzw. die Animation fast komplett stehen bleibt, die CPU auslastung aber nicht über 25% ist.

6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

du hast bestimmt ne 4 Kern CPU oder? Der GUI Thread (und davon gibts nunmal nur einen) wird einen Kern voll auslasten, daher 25 % und trotzdem ruckeln, weil die Leistung des einen Kerns nicht ausreicht.

Du sprichst von Saapes und Animationen, aber was machst du da genau? Da kann man schnell in Fallen tappen was die Performance angeht. Was für nen Layout Container benutzt du, was animierst du, brauchst du wirklich Shapes oder würden auch viel leichtgewichtigere Geometries reichen, wieviele Shapes hast du überhaupt etc.

Baka wa shinanakya naoranai.

Mein XING Profil.

36 Beiträge seit 2006
vor 12 Jahren

Hallo Stu42,

also momentan kann ich nur vermuten, dass deine Anwendung zu viel gleichzeitig verarbeitet.

Der Dispatcher wird im Grunde zum Verwalten von Threads der einzelnen UI Objekte. Am besten erklärt das dieser Artikel hier:
WPF-Threads: Erstellen reaktionsfähigerer Anwendungen mit dem Dispatcher

Ich denke, wir können dir weiter helfen wenn du uns ein Quellcodebeispiel postest. Oder Beschreibst genau was deine Anwendung macht, wie bereits talla geschrieben hatte. Also, einzelne Schrittte, wie, wenn ich die Maus bewege, wird die Methode ausgeführt.

Gruß
Codexzier

Nicht immer hilft Wissen weiter, manchmal muss man einfach daran glauben.

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 12 Jahren

Nach langem forschen habe ich das Problem gefunden:
Es ist ein/der "DropShadowEffect"!

Ich füge den Schatten so ein:


 <Grid>
        <Border Background="White" Padding="3" CornerRadius="3"
                HorizontalAlignment="Center"  VerticalAlignment="Center">
            <Border.Effect>
                <DropShadowEffect ShadowDepth="2" BlurRadius="6" RenderingBias="Performance" Opacity="0.75" />
            </Border.Effect>
            <src:Visualisation x:Name="uxVis" Background="White">
            </src:Visualisation>
        </Border>
     
    </Grid>

Doch da meine Visualisierung sich in der "Border" mit weißem Hintergrund befindet,
dürfte der Schatten doch eigentlich keine auswirkungen auf das Child-Element haben.

Gibt es dafür eine Abhilfe? Also das die Events nicht durch den Schatten beeinflusst werden?

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo Stu52,

das Problem ist vermutlich dass dein DropShadow nicht Hardware gerendert wird.
Dadurch geht dein Programm extrem in die Knie.

Es gibt aber auch eine Möglichkeit für Hardware unterstützten DropShadow.
Guckst du hier: A lightweight alternative to dropshadow bitmap effect

Gruß
Michael

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Michael,

es kann sein dass ich mich irre, aber die Effects (hier: DropShadowEffect ) sind hardwarebeschleunigt, hingegen die BitmapEffects (hier: DropShadowBitmapEffect) hingegen nicht. Dein Link zielt auf letzteren ab, Stu42 verwendet aber ersteren.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 12 Jahren

Ich glaube die BitmapEffects sind auch bereits als veraltet definiert, und lassen
sich ab version 3.5 oder 4.0 schon gar nicht mehr benutzen.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

und lassen
sich ab version 3.5 oder 4.0 schon gar nicht mehr benutzen.

ab 3.5 SP1 sind diese obsolet.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo gfoidl,

es kann sein dass ich mich irre, aber die Effects (hier: DropShadowEffect ) sind hardwarebeschleunigt, hingegen die BitmapEffects (hier: DropShadowBitmapEffect) hingegen nicht. Dein Link zielt auf letzteren ab, Stu42 verwendet aber ersteren.

Hm, ja da hast du wohl recht 😃
Aber das eigenartige ist dass es trotzdem so langsam wird, wenn der Schatten schon HW beschleunigt ist

Gruß
Michael

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 12 Jahren

Also dass die Auslastung auf einmal so hoch geht kommt nicht vom Rendern, sondern vom MouseMove.

Ich habe den Schatten und mein Control nun auf die selbe Ebene im VisualTree gestellt, und schon gehts.