Frage

Mit Hilfe des Background, habe ich eine Opazität Animation für eine Form.

Es gibt nur ein winziges Problem mit diesem Ansatz, aber ich kann nicht verstehen, wo das Problem ist. Die Animationsgeschwindigkeit ist konfigurierbar und auch wenn der Geschwindigkeitswert ist sehr hoch, manchmal die Animationen ist sehr, sehr langsam, aus irgendeinem Grunde ...

Die „langsame Animation“ ich spreche es nicht stottern ist, die Animation tatsächlich sehr glatt ist, dauert es nur mehr Zeit, um die ganze Animation auszuführen (von 0% bis 100%, oder umge Vers). Dies geschieht nur von Zeit zu Zeit. Es scheint (nicht sicher), dass es passiert, wenn der Computer eine andere, etwas intensiver tut, Hintergrund Aktion.

Ich brauche das natürlich zu beheben, aber ich würde auch gerne wissen, ob es überhaupt ist dieses Codes verbessern würde oder wenn Sie es anders machen und / oder besser.

Hier ist mein Code:

private const int TOGGLE_EFFECT_SPEED = 10;

private void blendWorker_DoWork(object sender, DoWorkEventArgs e) {
    bool blendIn = (bool)e.Argument;

    // Loop through all opacity values
    for(double value = 1; value <= 100; value += 1) {
        // Report the current progress on the worker
        blendWorker.ReportProgress(0, blendIn ? value : 100 - value);

        // Suspends the current thread by the specified blend speed
        System.Threading.Thread.Sleep(11 - TOGGLE_EFFECT_SPEED);
    }

    // Set the worker result as the inverse tag value
    e.Result = !blendIn;
}

private void blendWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    double opValue = (double)e.UserState;

    // Show and repaint the whole main notes window?
    if(opValue == 1.0) {
        Show();
        Invalidate(true);
    }

    // Set the main notes window opacity value
    Opacity = (double)e.UserState / 100;
}

private void blendWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    bool tagFlag = (bool)e.Result;

    // Hide the main notes window?
    if(tagFlag) {
        Hide();
    }

    // Set the main notes window tag value
    Tag = tagFlag;
}

/*
   THE FOLLOWING METHOD IS PART OF A DIFFERENT CLASS.
   ACTUALLY, IT'S THE "PROGRAM" CLASS WHERE MAIN()
   IS LOCATED. THIS METHOD IS CALLED TO SHOW/HIDE
   THE MAIN APPLICATION FORM WITH AN OPACITY ANIMATION
*/
internal static void ToggleNotesWindow() {
    // Get the tag value converted to boolean type
    bool tagFlag = Convert.ToBoolean(NotesWindow.Tag, CultureInfo.InvariantCulture);

    // Bring the main notes window to front?
    if(tagFlag) Program.NotesWindow.BringToFront();

    // Run the blend effect if it's not already running
    if(!NotesWindow.blendWorker.IsBusy) {
        NotesWindow.blendWorker.RunWorkerAsync(tagFlag);
    }

    // Activate and focus the main notes window?
    if(tagFlag) Program.NotesWindow.Activate();
}
War es hilfreich?

Lösung

Jedes Mal, wenn Sie die Opazität des Formulars zu ändern, hat Windows-alle Fenster darunter neu zu zeichnen, das Fenster selbst und dann Opazität anwenden (Vista tut dies viel schneller und gepuffert). Da Sie von 1 durch jeden Opazität Zustand sind Schritt ... 100 hat dieser Prozess 100 mal abzuschließen. Manchmal Nachziehen Fenster oder ein Fenster darunter langsam.

Die Thread.Sleep Methode mit einem Wert> 0 wird tief und von 0 ... ~ 10ms egal, welchen Wert Sie übergeben. Der Thread-Scheduler Timer-Auflösung auf Windows ist ca. 10 ms (Wieder, Vista und andere Betriebssystem ändern und optimieren, so ist es nicht genau), so dass Sie nicht eine Zeitscheibe kleiner ist als die planen. 100x10ms + die Zeit, um tatsächlich machen könnte nehmen Sie 2 ganze Sekunden / heraus zu verblassen in.

Die Art und Weise, es zu beschleunigen ist es, die Anzahl der zu reduzieren Wieder zieht. Anstatt +1 für Undurchsichtigkeit treten, Schritt 5, 10, etc. Das ist die Gesamtzahl der neu Ziehungen benötigt reduziert und in einer Form, in 100ms Fading anstelle führen würde.

Andere Tipps

Insgesamt sehe ich nicht viel, dass eine Änderung zumindest auf den ersten Blick rechtfertigen würden. Wenn Sie einige Performance-Engpässe sehen versuchen Sie vielleicht einen Blick auf Ants Profiler oder einem ähnlichen Code Profilierungswerkzeug mit, um zu sehen, wenn Sie irgendwelche langsamen Abschnitte genau bestimmen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top