jak sprawić, aby zdarzenia DispatcherTimer były gładsze w WPF?

W mojej aplikacji WPF użytkownik naciska przycisk, aby uruchomić płynnie obracający się model 3D, i naciska przycisk, aby zatrzymać obrót.

Aby to zrobić, tworzę DispatcherTimer:

DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler( timer_Tick );
timer.Interval = new TimeSpan( 0, 0, 0, 0, 30 );

A po naciśnięciu przycisku dzwoniętimer.Start() a kiedy przycisk jest zwolniony, dzwoniętimer.Stop().

Thetimer_Tick funkcja zmienia obrót modelu:

    void timer_Tick( object sender, EventArgs e )
    {
        spin = ( spin + 2 ) % 360;
        AxisAngleRotation3D rotation = new AxisAngleRotation3D( new Vector3D( 0, 1, 0 ), spin );
        Transform3D rotate = new RotateTransform3D( rotation );
        model2.Transform = rotate;
    }

Zauważam, że model obraca się płynnie w większości, ale często zamarza i zacina się, zatrzymując się na różne okresy czasu, czasami nawet do 1/4 sekundy.

Czy jest jakiś sposób, aby uczynić to płynniejszym? Rozumiem, że używając DispatcherTimer (w przeciwieństwie do, powiedzmy, System.Timers.Timer) wywołania zwrotne mają miejsce w wątku interfejsu użytkownika. Ale aby uruchomić linię, muszę być na zagrożeniu interfejsu użytkownika

        model2.Transform = rotate;

Przeczytałem o różnych sposobach uzyskania wywołania zwrotnego zegara w innym wątku. Ale wydaje się, że w końcu muszę zsynchronizować z wątkiem interfejsu użytkownika, aby wywołać tę linię. Jeśli użyję Invoke () do przeniesienia z, powiedzmy, wątku wywołania zwrotnego System.Timers.Timer do wątku interfejsu użytkownika, czy da to ogólniejszą płynność animacji? Wygląda na to, że nie powinien, ponieważ musi synchronizować się z wątkiem interfejsu użytkownika, podobnie jak DispatcherTimer. I o to chodzikażdy schemat ustawianiamodel2.Transform w regularnych odstępach czasu będzie w tej samej łodzi w odniesieniu do wątku interfejsu użytkownika, nie?

(Być może wtórne pytanie, staram się zrozumieć, co powoduje przerwy w pierwszej kolejności. O ile wiem, nic innego nie ma większego znaczenia w wątku UI. Więc nie rozumiem, co się dzieje podczas tych wątków. Czyszczenie śmieci? Nie wydaje się, żeby zbieranie było dużo śmieci, a nie wydaje się, żeby pauza była tak ekstremalna.)

questionAnswers(1)

yourAnswerToTheQuestion